JobPlus知识库 IT 工业智能4.0 文章
编写一个tf发布器

这个教程教你如何讲机器人的坐标系广播到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侦听器的教程。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
269人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序