介绍这两只海龟跟随背后的原理,怎样通过tf坐标系来完成广播与监听的编程实现
第一步,创建功能包learning_tf

cd ~/catkin_ws/src 在工作空间src下进入终端
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
这里我们需要去依赖roscpp,rospy,tf工具,还有和小海龟相关的turtlesim功能包

我们看到两个海海龟与world之间都有位置关系,这个位置关系要通过tf去广播出来的,看一下在程序里如何来实现
首先看一下如何通过tf来去广播任意两个坐标系之间的位置关系,称之为tf的广播器
第二步,创建tf广播器代码(C++)

将课件代码/learning_tf/src里的turtle_tf_broadcaster.cpp代码文件放置于catkin_ws/src/learning_tf/src里

turtle_tf_broadcaster.cpp代码文件内容

/*** 该例程产生tf数据,并计算、发布turtle2的速度指令*/#include <ros/ros.h>
#include <tf/transform_broadcaster.h>//包括tf变换的一个broadcaster
#include <turtlesim/Pose.h>    //包括海龟的位置,它是通过海龟仿真器turtlesim不断地往外去发布的,和前面去创建监听者去监听海龟的位置subscribe关系是一样,这里也是有一个subscribe来监听turtlesim里面海龟的实时位置的std::string turtle_name;//在函数里会传入海龟的位置,这个位置是海龟在整个坐标系下的X,Y坐标还有#theta(希腊字母)
void poseCallback(const turtlesim::PoseConstPtr& msg)
{// 创建tf的广播器,实例TransformBroadcaster//通过这个实例把海龟1或者海龟2相对于world坐标系的位置关系发出去static tf::TransformBroadcaster br;// 初始化tf数据//填充坐标系之间的映射关系;以turtle1为例,turtle1与world两个坐标系之间的位置关系包括平移和旋转,所以这两个数据组成了坐标变换transform;transform即是在机器人导论里学到的4×4矩阵数据,在transform里填数据:首先是平移即通过transform里的setOrigin来设置平移参数,包括围绕X,Y,Z三轴的平移;通过海龟的位置关系可以得到turtle1相对于world的X轴平移,y轴平移,由于是平面的所以z轴平移永远是0,他们组成向量Vector3,所以我们通过setOrigin把平移关系给设进来;;接下来设置旋转,通过Quaternion即四元数,通过setRPY即围绕X,Y,Z轴三轴的旋转可以设置姿态,这里X,Y方向都是0,只有Z轴有旋转关系,所以通过setRPY完成了两个坐标系之间姿态变化的数据的设置,然后通过setRotation把它设置到transform变量里面来;transform到目前为止,就保存了平移保存了旋转的关系,整个两个坐标系之间的位置关系就可以完全的描述出来,接下来通过Broadcaster br,通过sendTransform这样一个方法就可以把位置关系去发布广播出去,之后ros后台TF树就会把这两个坐标系的关系插入到对应的树中,上节看到的树就是这里的sendTransform广播之后变到树里来的;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);// 广播world与海龟坐标系之间的tf数据//添加一个时间戳,知道TF是有一个时间的概念的,默认可以保存10秒钟之内,ros::Time::now()表示当前时间;描述的是"world"和turtle_name(就是turtle1和turtle2)两个坐标系之间的位置关系,transform就是前面描述的这两个坐标系之间的位置关系。所以这里通过sendTransform广播出去了两个坐标系是谁,关系怎么样,以及两个坐标系关系是哪个时刻的,因为两个坐标系可能会发生变化;通过这句话后,TF树终究会出现world和turtle1或turtle2的位置关系了br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "my_tf_broadcaster");// 输入参数作为海龟的名字//判断输入参数,因为不管是海龟1还是海龟2,他和world之间的位置关系都是通用的一个程序不需要写两遍,所以通过main函数的输入参数来确定当前的这个程序执行的是turtle1还是turtle2,前者则建立前者和world的关系,后者则建立后者与world的关系。但注意,任意的ROS节点它的节点名在整个ROS环境当中只能有一个,想象一下如果这个程序执行两遍的话肯定会有节点名冲突的问题,后面会发现想办法让节点名换一个名字,这样程序就可以执行两遍了,在ROS中成为重映射if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;}//在这获取海龟的名字,argv[1]是字符串turtle_name = argv[1];// 订阅海龟的位姿话题ros::NodeHandle node;  //创建一个句柄,通过句柄来创建一个话题subscribe的订阅者,来订阅海龟仿真器里不断在发布的海龟位置信息turtle_name+"/pose",记得在turtlesim里默认发布的是turtle1/pose这样一个话题,如果是海龟2的话就是turtle2/pose,所以这里的turtle_name不是turtle1就是turtle2,和后面的pose接到一起就直接订阅仿真器里海龟的位置了,如果一旦有海龟位置在发布的话就会跳到回调函数poseCallback里来ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);// 循环等待回调函数//spin会不断在等待队列的数据,一旦有数据进来就会进到poseCallbackros::spin();return 0;
};

第二步,创建tf监听器代码(C++) 8.59

ROS入门-16.tf坐标系广播与监听的编程实现相关推荐

  1. 古月居 ROS 入门21讲--PA18 tf坐标系广播与监听的编程实现笔记

    古月居 ROS 入门21讲--PA18 tf坐标系广播与监听的编程实现 1.创建功能包 cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp ...

  2. 【RK3399Pro学习笔记】十四、ROS中tf坐标系广播与监听的编程实现

    目录 创建功能包 如何实现一个tf广播器 创建tf广播器代码(C++) 如何实现一个tf监听器 创建tf监听器代码(C++) 配置编译规则 编译并运行 python 编写程序 turtle_tf_br ...

  3. ROS系统实现 tf坐标系广播与监听

    安装Ros中 tf 相关功能包 sudo apt-get install ros-melodic-turtle-tf 启动launch文件,这个launch文件相当于一个脚本,可以一次性启动很多节点 ...

  4. 古月居ROS入门21讲-坐标系管理

    视频链接:bilibili 搜 古月居 源代码:关注古月居公众号,回复ROS入门21讲 文章目录 1 TF坐标变换 1.1 常用工具 2 tf坐标系广播与监听的编程实现 2.1 创建功能包 2.2 创 ...

  5. ROS入门五 TF坐标变换

    ROS入门五 TF坐标变换 坐标变换简介 TF功能包 是什么? TF功能包干什么 ? TF坐标变换如何实现? TF工具 乌龟例程中的TF 安装功能包turtle_tf 运行 实现TF的广播和监听功能 ...

  6. 判断frame是否已创建_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...

    创建TF广播和监听 #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtle ...

  7. 使用方法 ros_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...

    创建TF广播和监听 #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtle ...

  8. 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )

    文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...

  9. 源码级别的广播与监听实现

    作者 | 阿Q 来源 | 阿Q说代码 闲来无事,又翻了遍Spring的源码.不翻不知道,一翻吓一跳,之前翻过的源码已经吃进了肚子里,再见亦是陌生人. 今天就带大家从源码的角度来分析一下广播与监听的底层 ...

最新文章

  1. 百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口
  2. websocketpp 只发送一次
  3. Fiddler+willow使用指南
  4. UA MATH567 高维统计专题1 稀疏信号及其恢复7 LASSO的预测误差与变量选择一致性
  5. 深入理解Javascript闭包
  6. ggplot2绘图入门系列之四:再说散点图
  7. CSS / CSS3(新增)选择器及优先级原则
  8. Codeforces Round #319 (Div. 2)B. Modulo Sum DP
  9. Kafka消息系统基础知识索引消息
  10. 解决网易云音乐登录接口-460问题
  11. 谷歌、亚马逊在区块链都耽搁了什么 竟让后起的脸书名声大噪
  12. LM2596和LM2576区别,开关电源芯片LM2576和LM2596为什么开关频率越高,输出接电感值和电容值就越小呢?电感电容体积小,有利于减小开关电源整体模块的体积
  13. JAVA对接海康威视开发文档
  14. 数据字典模板_C++ 模板元编程:一种屠龙之技
  15. 计算机程序是怎样运行的
  16. 20岁到30岁,他从实习生做到百度最高决策层!
  17. IE10+删除input后面的叉
  18. 计算n个自然数的立方和
  19. teamviewer linux重启服务,Teamviewer在Linux下无法启动?
  20. c语言 linux sd_深入理解Linux C语言内存管理

热门文章

  1. [整理] mysql操作
  2. ntext字段的替换处理示例--全表替换(作者:邹建)
  3. JZOJ 3456. 【NOIP2013模拟联考3】恭介的法则(rule)
  4. 制作日历组件,点击出来一个弹窗
  5. 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
  6. choices相当于实现一个简化版的外键
  7. 【POJ Challenge】生日礼物 加强m子段和
  8. 关于Python在Linux、Mac和Windows上的安装方法总结
  9. MySql(13)—— MySQL查询行锁、解锁
  10. MySQL绿色版安装(mysql-5.7.12-win32)