ROS TF2静态坐标发布

  • 安装
  • CPP方式
  • launch文件方式
  • 利用终端的方式实现

我们经常需要进行坐标的变换,往往很多时候需要发布一个固定的坐标系转换例如从ENU转换到NED。对于这种转换是固定不变的,能减少资源的占用就最好,TF提供了静态坐标转换的方式,但是这种方式相当于静态发布一个转换,不是很好,下面介绍一下TF2经过优化过后的TF转换。

安装

防止后面依赖没有,把tf2的所有包都装一下,文件也大。

sudo apt-get install ros-$ROS_DISTRO-tf2-*

CPP方式

对于根据输入决定的固定坐标方式,例如本地坐标系和大地坐标系转换的时候,我们采用这种方式。
首先新建一个工作空间

mkdir -p  ~/tf_ws/src
cd ~/tf_ws/src

然后新建一个包

catkin_create_pkg learning_tf2 tf2 tf2_ros roscpp rospy turtlesim

然后在包下的src文件夹建立一个static_turtle_tf2_broadcaster.cpp文件,粘贴下面的内容后保存退出。

#include <ros/ros.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <geometry_msgs/TransformStamped.h>
#include <cstdio>
#include <tf2/LinearMath/Quaternion.h>std::string static_turtle_name;int main(int argc, char **argv)
{ros::init(argc,argv, "my_static_tf2_broadcaster");if(argc != 8){ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");return -1;}if(strcmp(argv[1],"world")==0){ROS_ERROR("Your static turtle name cannot be 'world'");return -1;}static_turtle_name = argv[1];static tf2_ros::StaticTransformBroadcaster static_broadcaster;geometry_msgs::TransformStamped static_transformStamped;static_transformStamped.header.stamp = ros::Time::now();static_transformStamped.header.frame_id = "world";static_transformStamped.child_frame_id = static_turtle_name;static_transformStamped.transform.translation.x = atof(argv[2]);static_transformStamped.transform.translation.y = atof(argv[3]);static_transformStamped.transform.translation.z = atof(argv[4]);tf2::Quaternion quat;quat.setRPY(atof(argv[5]), atof(argv[6]), atof(argv[7]));static_transformStamped.transform.rotation.x = quat.x();static_transformStamped.transform.rotation.y = quat.y();static_transformStamped.transform.rotation.z = quat.z();static_transformStamped.transform.rotation.w = quat.w();static_broadcaster.sendTransform(static_transformStamped);ROS_INFO("Spinning until killed publishing %s to world", static_turtle_name.c_str());ros::spin();return 0;
};

然后打开CMakeLists.txt添加下面的内容后保存后退出。

add_executable(static_turtle_tf2_broadcaster src/static_turtle_tf2_broadcaster.cpp)
target_link_libraries(static_turtle_tf2_broadcaster  ${catkin_LIBRARIES} )

然后编译

catkin_make

编译完了运行就OK。
先开一个终端

roscore

另开一个终端运行节点。

source ~/tf_ws/devel/setup.bash
rosrun learning_tf2 static_turtle_tf2_broadcaster mystaticturtle 0 0 1 0 0 0

我们新开一个终端查看静态发布情况。

rostopic echo /tf_static

我们再开一个终端可视化查看tf树。

rosrun rqt_tf_tree rqt_tf_tree

launch文件方式

有时候后静态转换是固定不变的,我们可以在程序开始运行的时候发布这个静态的转换,例如从标准的相机系到机体系的转换。
我们根本就没有必要再写上面这样一段程序,ros为我们提供了现成的包。可以在命令行或者launch文件中实现。终端方式后面讲。
格式如下

static_transform_publisher x y z yaw pitch roll frame_id child_frame_id

还可以通过四元数的方式来实现。

static_transform_publisher x y z qx qy qz qw frame_id child_frame_id

在相应的launch文件夹内新建一个名为static_transforms.launch的launch文件,然后写如下面的内容保存退出。

<launch><node pkg="tf2_ros" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1" />
</launch>

利用终端的方式实现

因为launch文件不会管各个节点的启动顺序,所以我们可以利用终端的方式来运行。
首先打开一个终端运行roscore

roscore

然后再开一个终端运行静态的坐标转换,格式和launch文件一样。

rosrun tf2_ros static_transform_publisher 0 0 1 0 0 0 link1_parent link1

想要同时运行多个命令相互之间是不会影响的。

ROS TF2静态坐标发布相关推荐

  1. ROS2机器人坐标工具→tf2静态广播←Python

    目标:学习如何使用 tf2 广播静态坐标系. 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系很有用. 例如,最容易推断激光扫描仪中心框架中的激光扫描测量值. 这是一个独立的教程,涵盖了 ...

  2. ROS————tf2介绍及教程

    本文参考资料: tf2 - ROS Wikihttp://wiki.ros.org/tf2 目录 前言 一.tf2的作用以及为什么要使用tf2 1.安装demo 2.运行demo 3.上面的例子代表着 ...

  3. 实战:将静态路由发布到动态路由

    将静态路由发布到动态路由 打开随书光盘中第6章练习"06 将静态路由发布到动态路由.pkt",如图6-22所示,河北师大和软件学院有各自独立的网络,有独立的IT部门管理自己的网络. ...

  4. 谷歌TF2.0凌晨发布!“改变一切,力压PyTorch”

    问耕 发自 凹非寺 量子位 出品 | 公众号 QbitAI TensorFlow 2.0终于来了! 今天凌晨,这个全球用户最多的深度学习框架,正式放出了2.0版本. Google深度学习科学家.Ker ...

  5. ROS在类中发布和接受消息(标准消息)

    作为模板写的时候方便查一下.本例生成两个节点talkerlisten1& 2, 互相接受对方消息,做了简单处理后在发出去.注意测试的时候先开B在开A. #include "ros/r ...

  6. ROS TF2 中的 四元数 基础部分

    ROS TF2 中的 四元数 基础部分 1.四元数的组成 2.将 RPY坐标系 下的 角度 转换为 四元数 3.如何通过四元数 做 旋转 4.四元数转置 5.求两个姿态(四元数)的旋转 5. 完毕 这 ...

  7. ROS基本操作(一):发布与订阅

    ROS官网教程 文章目录 1 创建ROS工作空间 2 创建ROS软件包 3 一个发布/订阅示例 4 构建节点 5 运行示例 1 创建ROS工作空间 创建ROS工作空间: $ mkdir -p ~/yo ...

  8. ROS中的坐标与坐标系转换

    ROS中的TF 官网建议新工作直接使用tf2,因为它有一个更清洁的界面,和更好的使用体验.(自ROS Hydro以来,tf第一代已被"弃用",转而支持tf2) TF介绍 TF(Tr ...

  9. 关于ros --tf2的使用

    在tf2系统中,将包分为tf2和tf2_ros. tf2用来进行坐标旋转,以及tf.msg两种四元素数据结构的变换: tf2_ros负责与ROS数据通信打交道,负责发布tf或订阅tf,即发布者和订阅者 ...

最新文章

  1. linux中断共享程序实现,如何在非实时linux上实现实时应用程序与内核模块之间共享存储器...
  2. 使用HTML5监測站点性能
  3. Linux 常用的压缩与解压缩命令详解
  4. 3最短路的几种解法 ------例题 最短路
  5. Ubuntu里的vi编辑器不好用的解决办法
  6. 在Docker中运行Spring Boot的高级功能测试
  7. django 模板语言之 simple_tag 自定义模板
  8. Charles之过滤信息
  9. SharePoint技术峰会2009视频(6)
  10. 伪元素控制网页表单样式
  11. IIS中WEB服务器的日志存放到SQL Server 2005中
  12. 多目标优化系列1---NSGA2的非支配排序函数的讲解
  13. 如何在VS中统计项目代码量
  14. linux查看磁盘内存cpu
  15. app ui ios airtest +python 环境搭建
  16. app后端设计(6)-- LBS
  17. 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题
  18. computed,watch
  19. InnoDB:page_cleaner:1000ms intended loop took [xxx]ms解决
  20. SAP MM批次切换

热门文章

  1. java编写的浏览器_Java编写简单的网页浏览器
  2. 保险产品即Token,众安科技的新区块链项目背后有何门道?
  3. 帮您解决开发SPI4W常见问题
  4. 微信小程序 TypeError: r.apply is not a function
  5. linux dc命令,Linux中dc命令起什么作用呢?
  6. 计算机二级自学考试,关于全国计算机等级考试(NCRE)与高等教育自学考试课程衔接的通知...
  7. 关系代数中的除操作怎么用SQL语句表示?
  8. 丛麟环保冲刺科创板:拟募资20亿 年利润超2亿
  9. 編程之美﹣電梯調度算法
  10. 用python刷微信阅读_使用python让微信读书自动翻页