ROS学习(二十一)--tf/增加一个框架frame

来源:互联网 发布:交大慧谷 数据库培训 编辑:程序博客网 时间:2024/04/20 10:59

为什么要增加框架

因为在自己的坐标系里比较容易处理数据,比如在一个扫描器的中心建立坐标系,并处理数据,会比在其他地方建立坐标系简单。tf允许我们给每个传感器建立一个本地坐标系。然后tf会处理每个单独的坐标系的变化信息。

在哪里添加框架

作为已有框架的的子框架

增加框架

先切换目录

roscd learning_tf

在src下新建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;};

解释:

transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );  14     transform.setRotation( tf::Quaternion(0, 0, 0, 1) );  15     br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));

这里我们创建了一个新的从turtle1到carrot1的transform,carrot1在turtle1左边两米的地方
运行frame broadcaster
将下面代码贴在CMakeLists.txt下

add_excutable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp)target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES})
catkin_make

如果bin文件夹中出现较frame_tf_broadcaster的二进制文件,打开start_demo.launch,加入下面代码

<node pkg="learning_tf" type="frame_tf_broadcaster"          name="broadcaster_frame" />

运行

roslaunch learning_tf start_demo.launch

运行后我们发现让一只乌龟运动,另一只乌龟的行动并没有什么变化。这是因为turtle2的活动轨迹是由listener决定的。而我们没有改变listener的内容。
打开turtle_tf_listener.cpp。找到下面代码。将”/turtle1”改成”/carrot”

listener.lookupTransform("/turtle2", "/carrot1",                           ros::Time(0), transform);

重新运行launch文件

catkin_makeroslaunch learning_tf start_demo.launch

发现turlte2不再跟着turtle1,而是跟着carrot1. 虽然carrot1在屏幕上没有表示出来,但是它是在carrot1的左边两米,所以我们看到carrot2朝着那个方向前进。

最后。我们这里的carrot1是一个固定的框架。没有随着时间的变化而变化。如果我们想让carrot1岁时间变化。

  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, 1) );

重新catkin_make,运行launch 就可以看到turtle2自己运动了。了

0 0
原创粉丝点击