这是一个关于实现把机器人的位姿广播到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 <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;//定义一个广播,相当于发布话题时定义一个发布器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在二维平面所以只有RPY的Yaw的信息,其他两个都设置为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><!-- 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="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" />
<!-- 是程序中我们需要输入的需要创建的link的子框架的名字传输过去--></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

Gmapping从开始到放弃—写一个TF 广播相关推荐

  1. Gmapping从开始到放弃—写一个TF 监听

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

  2. 深入理解如何不费吹灰之力搭建一个无人驾驶车(四)2D-小车自主部分(从无到有自己写一个无人驾驶框架)(CSDN独创)

    四.从无到有自己动手写个slam算法(CSDN独创) 注1:必须先看完前三章再看这一章,如果想看得轻松请看<概率机器人>与<机器人学状态估计>完再看 注2:本篇为CSDN独创, ...

  3. 用Golang写一个搜索引擎(0x05)--- 文本相关性排序

    上面我们已经说过了一些倒排索引的东西,并且也知道了如何来实现一个倒排索引完成检索功能,那么检索完了以后如何排序呢,这一篇简单的说一下倒排索引的文本相关性排序,因为排序实在是太复杂了,我们这里就说说文本 ...

  4. 写一个操作系统有多难?自制 os 极简教程

    不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了满足程序员们自带的成就感,还是为 ...

  5. 手把手教你写一个生成对抗网络

    成对抗网络代码全解析, 详细代码解析(TensorFlow, numpy, matplotlib, scipy) 那么,什么是 GANs? 用 Ian Goodfellow 自己的话来说: " ...

  6. animation基础练习源码_用vue简单写一个音乐播放组件「附源码」

    作者:vipbic 转发链接:https://segmentfault.com/a/1190000022980992 前言 上次小编也分享一个关于Vue 开发过音乐播放对项目: 基于 electron ...

  7. gpxclear寄存器写0和写1_画图,搭积木,写对象 [TF 笔记 0]

    前言 从2019年9月底到现在,TF 2.0 已经正式发布三个多月了.但其实很多和 2.0 相关的特性,比如说 eager 模式,@tf.function 装饰器和 AutoGraph, 以及 ker ...

  8. dotnet 从零开始写一个人工智能 网络模型

    本文将不使用任何人工智能框架,只用简单的 dotnet 的类,自己搭建一个人工智能网络.本文适合小伙伴跟着一步步写 特别感谢老马的程序人生的帮助,本文有大量代码都是从如何利用 C# 抽象神经网络模型抄 ...

  9. 动手造轮子:写一个日志框架

    动手造轮子:写一个日志框架 Intro 日志框架有很多,比如 log4net / nlog / serilog / microsoft.extensions.logging 等,如何在切换日志框架的时 ...

最新文章

  1. MongoDB的学习--聚合
  2. 【Android Protobuf 序列化】Protobuf 使用 ( protoc 编译器简介 | 下载 protoc 编译器 | 使用 protoc 编译器编译 .proto 源文件 )
  3. charset参数 sqluldr2_SQLULDR2的安全保密功能
  4. 获取dbgrid的行索引
  5. Linux执行yum不显示时间图形,Linux停的yum命令详解(朝花夕拾)
  6. CodeForces - 1076D Edge Deletion(最短路+贪心/最短路树+bfs)
  7. 转载:Windows CE内存管理
  8. java中整数如何表示,在Java中如何在位级别上内部表示整数?
  9. LaTeX 目录中显示“参考文献”条目
  10. NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》
  11. VMware 虚拟机安装OSX el capitan 11.12
  12. menuStrip之MdiWindowListItem判断子窗口是否被打开的方法
  13. Android调用默认浏览器打开指定url
  14. 大数据量下高并发同步
  15. 深度强化学习从入门到大师_深度学习大师的经验教训
  16. 网站漏洞修复之CSRF跨站攻击
  17. VMware安装统信UOS
  18. 系统集成项目管理之项目合同管理
  19. Excel文件的读取-xls格式篇
  20. UIImageJPEGRepresentation 使用中存在的问题

热门文章

  1. oracle sql 获取本季度所有月份,上季度所有月份
  2. django系列 1 :python+django环境搭建 +mac提示找不到manage.py命令
  3. windows下如何在一台机器上安装两个MYSQL数据库
  4. 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理
  5. Vim编辑器的常用快捷键.
  6. 20150726 填坑日记
  7. Linux下DB2数据库安装教程
  8. 用C#来开发CAD插件,含源代
  9. JAVA基础(JAVA 执行环境) 第一天
  10. 安装部署中的数据库打包和快捷方式启动浏览器