首页 > Gmapping从开始到放弃—写一个TF 广播

Gmapping从开始到放弃—写一个TF 广播

这是一个关于实现把机器人的位姿广播到TF中,这是对ROS 有一定的熟悉之后教程

(1)cd catkin_ws/src 进入我们的ROS 的工作空间

(2)catkin_create_pkg my_tf tf roscpp rospy turtlesim 这一句是新建一个ROS 的包,也就是一个ROS的工程,并添加他的依赖项,主要依赖tf和C++以及你可以使用python开发



(3) cd %YOUR_CATKIN_WORKSPACE_HOME%/

(4)catkin_make 编译一次

(5)source ./devel/setup.bash

然后在my_tf的src文件下新建一个文件,可以自由命名 但是后面也是要用的,这里就命名是turtle_tf_broadcaster.cpp

添加以下程序

#include 
#include 
#include std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg){static tf::TransformBroadcaster br;//定义一个广播,相当于发布话题时定义一个发布器broadcastertf::Transform transform;//定义存放转换信息(平动,转动)的变量transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); //设置坐标原点 2D位置并转换为3D位置,添加了一个z系,但是设为0.0tf::Quaternion q;  //声明一个四元数q.setRPY(0, 0, msg->theta); //这里因为turtlesim在二维平面所以只有RPYYaw的信息,其他两个都设置为0transform.setRotation(q); //设置旋转也就是把RPY信息转为四元数br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));//将变换广播出去 发布到tf广播中 StampedTransform四个参数我们可以知道 transform的setOrigin 和 setRotation就是设置小乌龟的位姿,Time时间戳也就是现在的时间, “world”我们需要将创建的link的父框架的名字传输过去,在这个例子中是world,最后,我们需要将创建的link的子框架的名字传输过去,在这里就是turtle本身}int main(int argc, char** argv){ros::init(argc, argv, "my_tf_broadcaster"); ////初始化ros,命名节点为my_tf_broadcasterif (argc != 2){ ROS_ERROR("need turtle name as argument"); return -1;};turtle_name = argv[1];  //乌龟的名字可以输入ros::NodeHandle node; ////NodeHandle是与ROS系统交流的最主要的接入点,是一个句柄ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);////从master订阅某乌龟的“/pose”话题,当消息到来时,即当乌龟位置改变时产生新的消息时,ROS将会调用poseCallback ros::spin();return 0;
};

总结: 假设你在机器人上应用,如果你知道机器人的位置x,y,z,与三个旋转角roll,pitch,yaw就可以广播一个tf了,如果在是平面移动机器人,则只需要知道x,y与yaw即可

(6)在CMakeLists.txt添加如下的两行

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})

(7)catkin_make 编译

编译完成之后,会发现会生成一个二进制文件,这个文件就是生成的可执行文件

(8)在my_tf文件下新建一个文件命名为launch之后新建一个命名为

start_demo.launch,并把下面的这段代码复制进去

<launch><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><param name="scale_linear" value="2" type="double"/><param name="scale_angular" value="2" type="double"/>
<node pkg="my_tf" type="turtle_tf_broadcaster"args="/turtle1" name="turtle1_tf_broadcaster" /><node pkg="my_tf" type="turtle_tf_broadcaster"args="/turtle2" name="turtle2_tf_broadcaster" />
launch>

(9)运行此程序

roslaunch learning_tf start_demo.launch



(10 )箭头按键就可以移动小乌龟,我们可以监听TF广播

rosrun tf tf_echo /world /turtle1





还有一篇在博客园的TF总结:

http://www.cnblogs.com/li-yao7758258/p/7672521.html

更多相关:

  • 在以前的教程中,通过添加TF广播器和TF监听器来重现小海龟演示。本教程将教你如何向TF树添加一个额外的坐标框架。这非常类似于创建TF广播,并且会显示TF的一些功能。对于许多任务系统来说,在局部框架内更容易理解,例如激光扫描仪的中心位置就是就是扫描仪的frame,TF可以允许为在系统中的每一个传感器定义一个局部的坐标系,TF 会为每一个...

  • 这篇文章主要 记录如何监听一个TF广播,通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息.当然也是接着上一篇文章创建的开发包继续走下去 (1)在my_tf文件下的src下新建一个文件命名turtle_tf_listener.cpp. 添加代码如下 #include #inclu...

  • 原文出处: 韩昊    1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事   谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师。   转载的同学请保留上面这句话,谢谢。如果还能保留文章来源就更感激不尽了。 我保证这篇文章...

  • 原文出处: 韩昊   我保证这篇文章和你以前看过的所有文章都不同,这是 2012 年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者…… 这篇文章的核心思想就是: 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维...

  • 很多Linux高手都喜欢使用screen命令,screen命令可以使你轻松地使用一个终端控制其他终端。尽管screen本身是一个非常有用的工具,byobu作为screen的增强版本,比screen更加好用而且美观,并且提供有用的信息和快捷的热键。 想象一下这样一个场景:你通过Secure Shell(ssh)链接到一个服务器,并...

  • NarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz,一个PRB,12个子载波。...

  •  [h1]反斜杠只能够阻止一个字符  [h2]位于键盘的左上角,和~公用一个键。...

  • 我们可以尝试用python的自带turtle库绘制一条蟒蛇 首先我们设计一下蟒蛇的基本形状 我们先把这段蟒蛇绘制的实例代码贴出来,各位可以在自己的本地运行一下看看效果,然后我们再继续分析代码: 1 #PythonDraw.py 2 import turtle 3 turtle.setup(650, 350, 200, 200...