博客参考:https://www.ncnynl.com/archives/201702/1310.html

ROS与C++入门教程-tf-编写tf broadcaster(广播)

说明:

  • 介绍如何广播机器人的坐标系到tf。

准备:

  • 在我们开始之前,你需要为这个项目创建一个新的ros包。
  • 创建一个名为learning_tf的软件包,该软件包依赖于tf,roscpp,rospy和turtlesim:
$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf tf roscpp rospy turtlesim $ cd ~/catkin_ws/src
$ catkin_make
$ source ./devel/setup.bash

广播变换

$ roscd learning_tf
$ touch 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;
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);
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
} int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;};
turtle_name = argv[1]; ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback); ros::spin();
return 0;
};

代码解释:

  • 代码:#include <tf/transform_broadcaster.h>

  • 作用:

    • tf包提供了TransformBroadcaster的实现,以帮助使发布变换的任务更容易。
    • 要使用TransformBroadcaster,我们需要包含tf/transform_broadcaster.h头文件。
  • 代码:static tf::TransformBroadcaster br;

  • 作用:我们创建一个TransformBroadcaster对象,我们稍后将使用它通过线路发送转换。

  • 代码:

tf::Transform transform;
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
  • 作用:这里我们创建一个Transform对象,并将信息从2D乌龟姿势复制到3D变换中。

  • 代码:transform.setRotation(q);

  • 作用:这里我们设置旋转。

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

  • 作用:

    • 这是真正的工作完成的地方。
    • 使用TransformBroadcaster发送转换需要四个参数。
    • 首先,我们传递转换本身。
    • 现在我们需要给被发布的变换一个时间戳,我们只是用当前时间戳它,ros::Time::now().
    • 然后,我们需要传递我们创建的链接的父框架的名称,在这种情况下为“world”
    • 最后,我们需要传递我们正在创建的链接的子框架的名称,在这种情况下,这是乌龟本身的名称。
  • 注意:sendTransform和StampedTransform具有父对象和子对象的相反顺序。

运行广播

  • 编辑CMakeLists.txt文件,增加:
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
  • 编译:
$ cd ~/catkin_ws/src
$ catkin_make
  • 如果编译顺利, 生成二进制的turtle_tf_broadcaster文件,位于devel/lib/learning_tf

  • 创建 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" />
<node pkg="learning_tf" type="turtle_tf_broadcaster"
args="/turtle2" name="turtle2_tf_broadcaster" /> </launch>
  • 执行launch
$ roslaunch learning_tf start_demo.launch
  • 你应该看到乌龟模拟另一个乌龟。

检查结果:

  • 现在,使用tf_echo工具检查龟的姿势是否真正得到广播到tf
$ rosrun tf tf_echo /world /turtle1
  • 这应该显示第一只乌龟的姿势。 使用箭头键(确保您的终端窗口是活动的,而不是你的模拟器窗口)绕乌龟。
  • 如果你运行tf_echo在/world和/turtle2之间的转换,你不应该看到一个变换,因为第二个乌龟还没有。
  • 但是,一旦我们在下一个教程中添加第二只乌龟,turtle2的姿势将被广播到tf。
												

ROS tf广播编写的更多相关文章

  1. ROS tf

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

  2. ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)

    ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...

  3. ROS tf监听编写

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

  4. ROS TF——learning tf

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

  5. SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  6. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. ROS tf基础使用知识

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

  8. ROS tf 两个常用的函数

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

  9. ROS tf 编程指南

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

随机推荐

  1. linux系统编程之信号(二)

    经过了漫长的间歇,对于c语言的学习也被中断了很久,现实确实有很多的无耐,计划中的事情总会被打乱,但不管怎样,学习的道路是不能休止的,所以经过了一断温习后现在继续学习C语言,话不多说,进入正题: 信号分 ...

  2. mysql开发相关

    1.mysql事务原理,特性,事务并发控制2.如何解决高并发场景下的插入重复3.乐观锁和悲观锁4.常用数据库引擎之间区别5.mysql索引6.B-Tree7.mysql索引类型8.什么时候创建索引9. ...

  3. 你的一举一动,我可都看着!Linux超骚技巧三分钟Get

    今天看到一个超级叼的linux命令,可以完整记录屏幕上的命令与输出结果. 有人问这有什么叼的,不就是保存历史操作记录吗?我看看日志也能看出来. 不不不,我要说的“完整记录”包括第几秒执行什么命令,就像 ...

  4. keras模块学习之Sequential模型学习笔记

    本笔记由博客园-圆柱模板 博主整理笔记发布,转载需注明,谢谢合作! Sequential是多个网络层的线性堆叠 可以通过向Sequential模型传递一个layer的list来构造该模型: from ...

  5. 项链与手镯Uva 10294——Polya定理

    题意 项链和手镯都是由若干珠子串成的环形首饰,区别在于手环可以翻转,但项链不可以. 输入整数 $n$ 和 $t$,输出用 $t$ 中颜色 $n$ 颗珠子能制作成的项链和手镯的个数.($1\leq n ...

  6. [Kubernetes] Kubectl and Pod

    1. Create and run a Pod kubectl run my-nginx --image=nginx:alpine We can run kubectl get all to see ...

  7. 013——MATLAB硬件支持包离线下载

    (一)参考文献:https://blog.csdn.net/hyperorbit/article/details/88095384 (二)去下列网址下载离线包下载工具:https://ww2.math ...

  8. C的realloc的动态分配扩展和缩小内存

    #include <stdio.h> #include <stdlib.h> void out(int *p, int n){ int i; for(i=0;i<n;i+ ...

  9. CODE FESTIVAL 2016 Final 题解

    传送门 \(A\) 什么玩意儿-- const char c[]={"snuke"}; char s[15];int n,m; int main(){ scanf("%d ...

  10. shell脚本编程基础之文件测试

    文件测试判断条件 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试指定路径是否为目录 -r FILE:测试当前用户对指定文件是否有读权限 -w FILE: ...