程序需要沉淀沉淀再沉淀!!!


前言

主要是学习tf坐标变换时候太吃力了,因此先学习官方给的小乌龟跟随这里的tf坐标变换。


直接上源码吧!!!turtle_tf2_broadcaster.cpp 内容如下:

先从主函数开始吧:

35行:ros::init(argc, argv, "my_tf2_broadcaster");这一句就不说了,稍微学过ros的就知道是啥了。

37行:ros::NodeHandle private_node("~");创建一个节点的句柄,用来参数服务器语句的判断。此处和我们定义node的方式不一样。以往我们定义node基本都是直接ros::NodeHandle nh。这里咋就多了一个参数~呢?;表示这个nodehandle是读取局部参数。

38行:if (! private_node.hasParam("turtle"));判断参数服务器中是否存在turtle这个参数,如果没有,则执行else语句。

先看if语句里面的内容:if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};判断argc里面的个数是否为2,如果不为2,那么打印ROS_ERROR("need turtle name as argument");并退出节点。如果argc==2,那么将argv[1]赋值给turtle_name,这里有同学可能会问,为什么不讲argv[0]里面的值给到turtle_name;是因为不管有没有参数输入进来,argv[0]永远都是可执行程序的名字。

48行:private_node.getParam("turtle", turtle_name);就是将参数服务器里面turtle的值赋值给到turtle_name这个字符串(第7行定义了turtle_name是一个字符串类型的数据)。

51行:ros::NodeHandle node;创建一个节点句柄,用来订阅回调函数poseCallback。

poseCallback

54行:ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);// 第一个参数指定订阅话题topic;第二个参数设置消息缓冲区的大小;第三个参数指定回调函数。这里需要注意的是turtle_name是一个变量;turtle_tf2_broadcaster_cpp.launch文件里面有说明,最后再讲。

57行:ros::spin();这个就不说了。

接下来看回调函数poseCallback:

13行:static tf2_ros::TransformBroadcaster br;// 定义一个广播TransformBroadcaster,将坐标变换通过话题发布出去,这里为什么是用static,是为了防止重复,因为turtle_tf2_listener.cpp也用到了。

14行:geometry_msgs::TransformStamped transformStamped;实例化transformStamped结构体

16-21行:

transformStamped.header.stamp = ros::Time::now();
    transformStamped.header.frame_id = "world";
    transformStamped.child_frame_id = turtle_name;
    transformStamped.transform.translation.x = msg->x;
    transformStamped.transform.translation.y = msg->y;
    transformStamped.transform.translation.z = 0.0;

ros::Time::now();表示ros里面当前的时间;world是父坐标;turtle_name是子坐标。

具体两个坐标之间的关系是怎么样的呢?自然就涉及到给坐标系之间的rotation和translation赋值。我们说回调函数接收到的是turtle的位置和方向,那么msg中的位置和方向我们就需要赋值transformStamped。先赋值 translation,后赋值 rotation 。19-20行 这里将x轴y轴的坐标赋值给了transformStamped。这里的理解讲得很清楚了。

23行:tf2::Quaternion q;  //头文件部分包含了#include <tf2/LinearMath/Quaternion.h>,代码有一行定义了tf::quaternion的对象tf::Quaternion q需要通过包含这个头文件来实现。

24行:q.setRPY(0, 0, msg->theta);调用了Quaternion中setRPY函数来获取角度值。

25-28行:这里是获取角度,以四元数的形式来获取。

30行:br.sendTransform(transformStamped);将获取的transformStamped发送出去,主函数来订阅。

最后讲一下turtle_tf2_broadcaster_cpp.launch里面的内容吧:

第4和第6行分别是创建一个海龟、开启键盘控制节点。

第8、9行就不说了,太简单了没意思。

第11-18行是node语法,不懂的同学需要自行去学习一下node节点的语法。这里提一下:仔细看这段程序我们会发现:功能turtle_tf2里面的可执行文件turtle_tf2_broadcaster被调用了2次,用一个功能包执行2种不同的参数输入,这样不就提高了代码的复用率了吗?答案是的。

第17到18行是开启监听器的节点,下章节再讲吧,打字太累了哈哈哈。

【ROS】官方tf教程turtle_tf2源码原理解读相关推荐

  1. [C#HttpHelper]官方产品发布与源码下载---苏飞版

    转自:http://www.sufeinet.com/thread-3-1-1.html C#HttpHelper官方产品发布与源码下载---苏飞版 导读部分 -------------------- ...

  2. 毕业设计-基于SSM框架大学教务管理平台项目开发实战教程(附源码)

    文章目录 1.项目简介 2.项目收获 3.项目技术栈 4.测试账号 5.项目部分截图 6.常见问题 毕业设计-基于SSM框架大学教务管理平台项目实战教程-附源码 课程源码下载地址:https://do ...

  3. Odoo16 教程含源码

    Odoo16 教程含源码 Odoo16 开发教程 版本变化 模块开发步骤 源码 Odoo16 开发教程 Odoo 号称全球第一的开源ERP平台,除了提供一站式的企业应用开发解决方案,作为一个网站设计器 ...

  4. LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code

    LIRE教程之源码分析 |LIRE Tutorial of Analysis of the Source Code 最近在做地理图像识别和检索的研究,发现了一个很好用的框架LIRE,遂研究了一通.网上 ...

  5. 企业开源测试项目实战(附全套实战项目教程+视频+源码)

    接口测试项目 1. No matching distribution found for itypes==1.1.0 Could not find a version that satisfies t ...

  6. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  7. clickhouse原理解析与开发实战 pdf_Spring全家桶集合:SpringBoot+SpringCloud实战,Spring源码原理...

    一.Spring技术内幕(电子书籍赠送) 深入解析Spring架构与设计原理 本书探讨了Spring框架的设计原理.架构和运行机制.作为在Java领域最为成功的开源软件之一,Spring在Java E ...

  8. Unity+KBEngine实战系列1——棋牌(含完整教程与源码)

    2019独角兽企业重金招聘Python工程师标准>>> Unity+KBEngine实战系列1--棋牌(含完整教程与源码) 分享下KBEngine + u3d做的房卡麻将,就是一般的 ...

  9. Contiki源码+原理+功能+编程+移植+驱动+网络(转)

    源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...

最新文章

  1. swift_033(Swift 必备和常用第三方库以及pod使用)
  2. python画图代码星星-Python利用for循环打印星号三角形的案例
  3. JAVA基础代码分享--模拟人机猜拳系统
  4. spark匹配html字段,Apache Spark中的高效字符串匹配
  5. Preference跳转activity出错Unable to find explicit activity class
  6. JavaScript进阶(一)--执行上下文
  7. 【操作系统复习】进程的定义、组成、组织方式
  8. y电容如何选型_干式试验变压器选型依据
  9. 看了IDC 2018 Q1存储报告,才知道宏杉科技为什么稳稳的
  10. 第三十四讲项目2.1-麻烦的累加涨功夫
  11. 英语句子划分表示符号使用规则
  12. 使用Python 绘制双Y轴和误差棒柱状图
  13. MSCOCO数据集转VOC数据集训练目标检测模型
  14. APP调用支付宝客户端发起支付
  15. extjs google统计图
  16. 移动硬盘无法读取,也无法显示?看高手是怎么恢复的
  17. 思维导图软件哪个好?分享3款免费的思维导图软件
  18. RPC 框架 Kitex 初体验 (虚拟机环境)
  19. html wap广告代码,手机wap底部悬浮JS广告代码
  20. oracle中prad函数_高一数学必修4教案模板精选

热门文章

  1. 越小越好:小型化射频-第2部分
  2. 合并两个 Wav 文件流的函数 - 回复 刘文强 的问题
  3. 理科计算机专业分数线,武汉大学2017年计算机专业录取分数线(贵州理科考生)...
  4. Java+Rest-Assrued+Gradle+Allure搭建接口测试自动化框架
  5. 爱康科技收购北京碳诺科技 加速公司碳排放战略布局
  6. 什么是IssS,PaaS和SaaS及其区别
  7. 轻松获得最新的网通、电信、铁通IP地址分配段
  8. 让你分分钟学会qt视频播放器
  9. 毕业四年后一次同学聚会-性格决定命运
  10. 用python爬取豆瓣某本书的前n条书评并计算评分(star)的平均值