ROS tf广播编写
博客参考: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
广播变换
- 新建文件turtle_tf_broadcaster.cpp. 参考源码
$ 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广播编写的更多相关文章
- ROS tf
一.节点中使用(cpp,python) 1. ros wiki 提供的tutorials 2. https://blog.csdn.net/start_from_scratch/article/det ...
- ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)
ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...
- ROS tf监听编写
博客转载自:https://www.ncnynl.com/archives/201702/1311.html ROS与C++入门教程-tf-编写tf listener(监听) 说明: 介绍如何使用tf ...
- ROS TF——learning tf
在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- ROS tf基础使用知识
博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ...
- ROS tf 两个常用的函数
/** \brief Get the transform between two frames by frame ID. * \param target_frame The frame to wh ...
- ROS tf 编程指南
ROS (Robot Operating System, 机器人操作系统)是最知名的机器人操作系统,广泛应用于无人驾驶和机器人,tf(transforms,坐标系转换)是ROS下的一个常用的工具库.r ...
随机推荐
- Spring -07 -AOP [面向切面编程] - 使用注解@+ AspectJ 方式实现环绕/前/后等通知 -超简洁 --静态代理/动态代理{JDK/cglib}
1.spring 不会自动去寻找注解,必须告诉 spring 哪些包下的类中可能有注解;使用注解来取代配置文件.1.1 引入xmlns:context ,指定扫描范围 <context:comp ...
- test20190519 NOIP 模拟赛 3
序列 [问题描述] 作为一名火星人,你为了占领地球,需要想方设法使地球人失去信心.现在你获得了一项能力,控制今后 n 天的天气温度,对于第 i 天,你能将温度控制在[ai,bi]中任意一个数字, 你的 ...
- dedecms自定义表单提交获取时间跟ip地址
相信大家在用织梦做网站的时候都用过自定义表单做留言,但是如何查看客户什么时间填写的表单,和客户的IP地址呢? 我在网上找了很多JS文件,但太繁琐了,后来我注意到一个细节,每次我登陆后台,织梦系统都会记 ...
- 批量把pod实例调成0
#!/bin/bash namespace=`kubectl get ns|grep '^te-'|grep -v datamgr|awk '{print $1}'` #--------------- ...
- HiveQL Index 索引
Hive只有有限的索引功能.Hive中没有普通关系型数据库中键的概念,但是还是可以对一些字段建立索引来加速某些操作.一张表的索引数据存储在另外一张表中. 通过explain命令可以查看某个查询语句是否 ...
- cube.js 学习(一)简单项目创建
cube.js 是一个很不错的模块化分析框架,基于schema生成sql 同时内置可代码生成,可以快速的搞定 web 分析应用的开发 安装cli 工具 npm install -g cubejs-cl ...
- centos vim 配置
centos 6.5使用源码安装vim 7.41.下载vim的源码.vim官网是www.vimunix.com/vim使用链接下载7.4源码包:ftp://ftp.vim.org/pub/vim/un ...
- cometoj---contest#3 棋盘
棋盘:(状压dp) 传送门:https://www.cometoj.com/contest/38/problem/B?problem_id=1535 题目描述 小猫有一个 2×N 的棋盘,每一个格子放 ...
- [ThinkPHP6.*安装 (草稿先发布,再维护)
ThinkPHP6.0的安装,官方文档中有详细的说明,不过在安装之前,大家还是要做一些准备的,就是PHP本地开发环境 的搭建. 官方手册地址:https://www.kancloud.cn/manua ...
- golang-笔记2
结构体: 是一种数据 类型. type Person struct { —— 类型定义 (地位等价于 int byte bool string ....) 通常放在全局位置. name string ...