前言:将海龟的坐标系变换广播到TF。

URDF文件的描述是在相对坐标上进行的,运动起来就需要考虑机器人各个连杆的相对位置关系。TF的诞生就是为了自动管理这些相对关系下的坐标变换的,而我们需要做的就是给出连杆之间的相对位置关系,剩下的在运动中的坐标变换,速度关系,位置等信息就都由TF功能包自动处理完成。更直观的描述请参考:http://www.guyuehome.com/355

坐标标签有:位置坐标x,y,z和旋转角roll,pitch,yaw。例如如果只在平面移动,则只需要x,y,yaw即可。

一、新建功能包

在工作空间中新建功能包learning_tf tf roscpp rospy turtlesim

二、新建cpp文件

新建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;
  tf::Transform transform;//定义存放转换信息(平动,转动)的变量
  transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );//设置坐标原点
//定义旋转
  tf::Quaternion q;
  q.setRPY(, , msg->theta);
  transform.setRotation(q);

  br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));//新建坐标系turtle_name,父坐标系为world,坐标系相对位置为transform
}

int main(int argc, char** argv){
  ros::init(argc, argv, "my_tf_broadcaster");
  ){ROS_ERROR(;};
  turtle_name = argv[];

  ros::NodeHandle node;
  ros::Subscriber sub = node.subscribe(turtle_name+, &poseCallback);

  ros::spin();
  ;
};

----------------------------------------

代码解释:

大概思路是:接收turtle1的位置话题(/turtle1/pose),此时调用回调函数,将位置信息发布到tf

#include <tf/transform_broadcaster.h>,TF功能包提供了一个广播工具TransformBroadcaster,这个类需要引用<tf/transform_broadcaster.h>头文件

  tf::Transform transform;
  transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
  tf::Quaternion q;
  q.setRPY(, , msg->theta);

这里创建了一个变换实例,并将2D位姿信息转化为3D位姿信息。

transform.setRotation(q);

这里设置了旋转

br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));

使用TransformBroadcaster发送TF变换需要四个参数:

  1. 变换本身
  2. 时间戳
  3. 提供连杆的父框架,这里是world
  4. 提供连杆的子框架,即自身,这里是乌龟本身。

三、新建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="learning_tf" type="turtle_tf_broadcaster"
          args="/turtle1" name="turtle1_tf_broadcaster" />
  </launch>

运行launch文件

roslaunch learning_tf start_demo.launch

四、查看广播

rosrun tf tf_echo /world /turtle1

参考自:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20broadcaster%20%28C%2B%2B%29

-END-

ROS-TF-广播的更多相关文章

  1. ROS tf广播编写

    博客参考:https://www.ncnynl.com/archives/201702/1310.html ROS与C++入门教程-tf-编写tf broadcaster(广播) 说明: 介绍如何广播 ...

  2. ROS tf

    一.节点中使用(cpp,python) 1. ros wiki 提供的tutorials 2. https://blog.csdn.net/start_from_scratch/article/det ...

  3. ROS TF——learning tf

    在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...

  4. ROS tf监听编写

    博客转载自:https://www.ncnynl.com/archives/201702/1311.html ROS与C++入门教程-tf-编写tf listener(监听) 说明: 介绍如何使用tf ...

  5. ROS tf基础使用知识

    博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ...

  6. ROS tf 两个常用的函数

    /** \brief Get the transform between two frames by frame ID.   * \param target_frame The frame to wh ...

  7. ROS tf 编程指南

    ROS (Robot Operating System, 机器人操作系统)是最知名的机器人操作系统,广泛应用于无人驾驶和机器人,tf(transforms,坐标系转换)是ROS下的一个常用的工具库.r ...

  8. ros之tf坐标系广播与监听的编程实现

    创建功能包-learning_tf $ cd ~/catkin_ws/src $ catkin_create_pkg learning_tf roscpp rospy tf turtlesim 如何创 ...

  9. ROS 机器人技术 - 广播与接收 TF 坐标

    上次我们学习了 TF 的基本概念和如何发布静态的 TF 坐标: ROS 机器人技术 - TF 坐标系统基本概念 ROS 机器人技术 - 静态 TF 坐标帧 这次来总结下如何发布一个自定义的 TF 坐标 ...

  10. ROS探索总结(十八)——重读tf

    在之前的博客中,有讲解tf的相关内容,本篇博客重新整理了tf的介绍和学习内容,对tf的认识会更加系统. 1 tf简介 1.1 什么是tf tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数 ...

随机推荐

  1. OpenCV:OpenCV目标检测Hog+SWindow源代码分析

    参考文章:OpenCV中的HOG+SVM物体分类 此文主要描述出HOG分类的调用堆栈. 使用OpenCV作图像检测, 使用HOG检测过程,其中一部分源代码如下: 1.HOG 检测底层栈的检测计算代码: ...

  2. (转)C#开发微信门户及应用(6)--微信门户菜单的管理操作

    http://www.cnblogs.com/wuhuacong/p/3701961.html 前面几篇继续了我自己对于C#开发微信门户及应用的技术探索和相关的经验总结,继续探索微信API并分享相关的 ...

  3. vue路由中的 Meta

    在项目中肯定有这样的需求,那就是在某个页面的时候,顶部展示 现在当前的页面路径,如下图: 这个在vue中其实很好实现. 首先出现这个肯定是相对应不同的页面,也就是说对应不同的路由,我们在定义路由的时候 ...

  4. How to use pthread_create && mutex?

    1 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread. ...

  5. nyoj51-管闲事的小明

    管闲事的小明 时间限制:4000 ms  |  内存限制:65535 KB 难度:2 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端 ...

  6. centos最小化系统安装VMware tool

    1.先执行命令创建环境 yum -y install update yum -y install gcc kernel-headers kernel-devel 2.然后重启reboot 3.挂载,解 ...

  7. 爬虫系列(四) 用urllib实现英语翻译

    这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...

  8. PHP利用Mysql锁解决高并发

    前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ...

  9. python爬虫04 | 长江后浪推前浪,Reuqests库把urllib库拍在沙滩上

    最近 有些朋友 看完小帅b的文章之后 把小帅b的表情包都偷了 还在我的微信 疯狂发表情包嘚瑟 我就呵呵了 只能说一句 盘他 还有一些朋友 看完文章不点好看 还来催更 小帅b也只能说一句 继续盘他   ...

  10. Leading and Trailing

    You are given two integers: n and k, your task is to find the most significant three digits, and lea ...