这个教程教你如何讲机器人的坐标系广播到TF。
1.在开始之前,您需要为这个项目创建一个新的ROS包。在示例文件夹中,创建一个名为learning_tf的包,它依赖于TF、roscpp、rospy和TurtleSim:
$ cd %YOUR_CATKIN_WORKSPACE_HOME%/src
$ catkin_create_pkg learning_tf tf roscpp rospy turtlesim
建立新的软件包:
$ cd %YOUR_CATKIN_WORKSPACE_HOME%/
$ catkin_make
$ source ./devel/setup.bash
本教程教你如何将坐标帧广播到TF。在这种情况下,我们要广播turtle变化的坐标系,因为它们四处移动。
让我们首先创建源文件。去我们刚刚创建的包:
$ roscd learning_tf
转到src/文件夹并启动你喜欢的编辑器将下面的代码粘贴到一个新文件中src/turtle_tf_broadcaster.cpp
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg){
static tf::TransformBroadcaster br;
tf::Transform transform;
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation(q);
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}
int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};
turtle_name = argv[1];
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);
ros::spin();
return 0;
};
2.代码解释:
现在,让我们来看看与turtle姿态发布到TF相关的代码。
#include <tf/transform_broadcaster.h>
TF包提供了一个TransformBroadcaster的实现,以帮助发布转换的任务更容易。要使用TransformBroadcaster,我们需要包括 tf/transform_broadcaster.h头文件。
static tf::TransformBroadcaster br;
在这里,我们创建一个TrimeBultoCaster对象,稍后我们将使用它来通过线上发送转换。
tf::Transform transform;
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
在这里,我们创建一个变换对象,并将信息从2Dturtle姿态复制到3D变换中。
transform.setRotation(q);
这里我们设置旋转。
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
这就是真正的工作完成的地方。用变换广播发送一个变换需要四个参数。
1.首先,我们通过转换本身。
2.现在我们需要给发布的变换一个时间戳,我们会用当前时间戳ros :: Time :: now()。
3.然后,我们需要传递我们创建的链接的父框架的名称,在这个例子中是“world”;
4.最后,我们需要传递我们创建的链接的子框架的名称,在这种情况下,这是turtle本身的名称。
现在我们创建了代码,让我们先编译它。 打开CMakeLists.txt文件,并在底部添加以下行:
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
在catkin workspace文件夹下编译ros包:
$ catkin_make
如果一切顺利,您的devel / lib / learning_tf文件夹中应该有一个名为turtle_tf_broadcaster的二进制文件。
如果是这样,我们准备为这个演示创建一个启动文件。 使用文本编辑器创建一个名为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>
现在,你可以准备好开始你自己的turtle广播演示:
$ roslaunch learning_tf start_demo.launch
你应该看到一只turtle。
现在,使用tf_echo工具来检查turtle姿态是否实际上正在广播到tf:
$ rosrun tf tf_echo /world /turtle1
这应该告诉你第一只乌龟的姿势。 使用箭头键在乌龟周围驱动(确保您的终端窗口处于活动状态,而不是您的模拟器窗口)。 如果你运行tf_echo来进行世界和海龟2之间的转换,你不应该看到转换,因为第二只海龟还没有。 但是,只要我们在下一个教程中添加第二只乌龟,乌龟2的姿势就会广播给tf。
12 transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); 13 tf::Quaternion q; 14 q.setRPY(msg->theta, 0, 0);
要实际使用广播到tf的转换,您应该转到下一个关于创建tf侦听器的教程。
登录 | 立即注册