ROS tf基础使用知识
博客参考:https://www.ncnynl.com/archives/201702/1306.html
ROS与C++入门教程-tf-坐标变换
说明:
- 介绍在c++实现TF的坐标变换
概念:
- Coodinate Frames (坐标框架,坐标系)
- Transforms (变换)
- TF
参考:
- TF中的几何对象表示的TF类型,这是相当于相应的bullet类型;见TF数据类型。
- Bullet类参考transforms和quaternions
Frames and Points
- Frame是坐标系统,在ROS里都是以3D形式存在,右手原则,X向前,Y向左,Z向上.
- Points在坐标系以tf::Point形式表达,等同与bullet类型的btVector3。
- 在坐标系W里,坐标的点p,可以用:Wp
其余参考原文:http://wiki.ros.org/tf/Overview/Transformations
ROS与C++入门教程-tf-广播变换
说明:
- 介绍如何在roscpp的节点广播变换关系。
广播变换:
- 在节点里广播变换,推荐使用tf::TransformBroadcaster.
构造器
- 无参数构造器:
tf::TransformBroadcaster();
发送变换
- 发送变换通过调用sendTransform()函数实现,传递StampedTransform或geometry_msgs::TransformStamped为参数
- 示例代码:
void sendTransform(const StampedTransform & transform);
void sendTransform(const geometry_msgs::TransformStamped & transform);
ROS与C++入门教程-tf-使用已发布的变换
说明:
- 介绍roscpp节点获取和使用TF的变换。
TransformListener
- 通过调用 tf::TransformListener类来处理变换,它继承自tf::Transformer。
核心方法
(1)构造函数
- 示例代码:
TransformListener(const ros::NodeHandle &nh, ros::Duration max_cache_time=ros::Duration(DEFAULT_CACHE_TIME), bool spin_thread=true)
TransformListener(ros::Duration max_cache_time=ros::Duration(DEFAULT_CACHE_TIME), bool spin_thread=true)
(2)辅助方法
- 示例代码:
std::string tf::TransformListener::resolve (const std::string &frame_id)
- 结合tf_prefix获取解析的frame_id,查阅geometry/CoordinateFrameConventions.
(3)canTransform()函数
- 返回bool ,判断能否实现变换。不会抛出异常,如果出错,会返回error_msg的内容。
- 基本API:
bool tf::TransformListener::canTransform (const std::string &target_frame, const std::string &source_frame, const ros::Time &time, std::string *error_msg=NULL) const
- 检查在时间time,source_frame能否变换到target_frame。
- 高级API:
bool tf::TransformListener::canTransform (const std::string &target_frame, const ros::Time &target_time, const std::string &source_frame, const ros::Time &source_time, const std::string &fixed_frame, std::string *error_msg=NULL) const
- 检查在时间source_time,source_frame能否变换到fixed_frame,那么再实现在target_time变换到target_frame。
(4)waitForTransform()函数
- 返回bool值,评估变换是否有效。
- 基本API:
bool tf::TransformListener::waitForTransform (const std::string &target_frame, const std::string &source_frame, const ros::Time &time, const ros::Duration &timeout,
const ros::Duration &polling_sleep_duration=ros::Duration(0.01), std::string *error_msg=NULL) const
- 检查在时间time, source_frame能否变换到target_frame
- 它将休眠并重试每个polling_duration,直到超时的持续时间已经过去。 它不会抛出异常。 在一个错误的情况下,如果你传递一个非NULL字符串指针,它会填充字符串error_msg。 (注意:这需要大量的资源来生成错误消息。)
- 高级API
bool tf::TransformListener::waitForTransform (const std::string &target_frame, const ros::Time &target_time, const std::string &source_frame, const ros::Time &source_time,
const std::string &fixed_frame, const ros::Duration &timeout, const ros::Duration &polling_sleep_duration=ros::Duration(0.01), std::string *error_msg=NULL) const
- 测试在source_time时间,source_frame能否变换到fixed_frame,那么在target_time,变换到target_frame。
(5)lookupTransform
lookupTransform()是一个更底层的方法用于返回两个坐标系的变换。
这个方法是 tf库的核心方法。大部分transform的方法都是终端用户使用,而这个方法设计在transform()方法内使用的。
返回的变换的方向将从target_frame到source_frame。 如果应用于数据,将把source_frame中的数据转换为target_frame。查阅geometry/CoordinateFrameConventions#Transform_Direction
这个方法会抛出TF的异常
基本API:
void tf::TransformListener::lookupTransform (const std::string &target_frame, const std::string &source_frame, const ros::Time &time, StampedTransform &transform) const
- 在时间time上使用从source_frame到target_frame的变换填充transform
- 高级API:
void tf::TransformListener::lookupTransform (const std::string &target_frame, const ros::Time &target_time, const std::string &source_frame, const ros::Time &source_time,
const std::string &fixed_frame, StampedTransform &transform) const
- 在source_time使用从source_frame到fixed_frame的变换填充transform,在target_time从fixed_frame到target_frame的链接变换。
transformDATA 方法
- tf::TransformListener类的主要目的是在坐标系间进行变换数据。
- 支持的数据类型:
|
C++ Method Name |
Python Method Name |
Full Datatype |
|
transformQuaternion() |
none |
tf::Stamped<tf::Quaternion> |
|
transformVector() |
none |
tf::Stamped<tf::Vector3> |
|
transformPoint() |
none |
tf::Stamped<tf::Point> |
|
transformPose() |
none |
tf::Stamped<tf::Pose> |
|
transformQuaternion() |
transformQuaternion() |
|
|
transformVector() |
transformVector3() |
|
|
transformPoint() |
transformPoint() |
|
|
transformPose() |
transformPose() |
|
|
transformPointCloud() |
transformPointCloud() |
- 基本API:
void tf::TransformListener::transformDATATYPE (const std::string &target_frame, const geometry_msgs::DATATYPEStamped &stamped_in, geometry_msgs::DATATYPEStamped &stamped_out) const
- 将数据stamped_in转换为target_frame,使用标记的数据类型中的frame_id和stamp作为源。
- 高级API:
void tf::TransformListener::transformDATATYPE (const std::string &target_frame, const ros::Time &target_time, const geometry_msgs::DATATYPEStamped &pin,
const std::string &fixed_frame, geometry_msgs::DATATYPEStamped &pout) const
- 将数据stamped_in转换为fixed_frame。 使用标记数据类型中的frame_id和stamp作为源。 然后在target_time从fixed_frame变换到target_frame。
ROS与C++入门教程-tf-异常
说明:
- 介绍roscpp的tf的异常类型及作用
TF异常
- 所有在TF里异常继承自tf::TransformException,它继承自std::runtime_error。
异常类型:
- 异常类:tf::ConnectivityException
- 作用:如果由于两个坐标系ID不在同一个连接的树中而无法完成请求,则抛出。
- 异常类:tf::ExtrapolationException
- 作用:如果请求的坐标系id之间存在连接,但一个或多个变换已过期,则抛出。
- 异常类:tf::InvalidArgument
- 作用:如果参数无效则抛出。 最常见的情况是非规范化的四元数。
- 异常类:tf::LookupException
- 作用:如果引用了未发布的坐标系ID,则抛出。
ROS tf基础使用知识的更多相关文章
- 论Linux运维的一些基础安全知识和简单办法
不知不觉本人来北京也已经第三个年头了,从一个Linux小小鸟,开始,2012年我参加了第一份工作,其实现在想想其实我是幸运的,本来求学的时候,就没好好的学Linux,我认为有Cisco知识从上wind ...
- JAVA面向对象-----面向对象(基础预备知识汇总)
终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...
- ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera
ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera 软件包下载地址:https://github.com/bosch-ros-pkg/usb_cam 下载后, ...
- ROS_Kinetic_11 ROS程序基础Eclipse_C++(二)
ROS_Kinetic_11 ROS程序基础Eclipse_C++(二) 编写简单的Service和Client (C++): http://wiki.ros.org/cn/ROS/Tutorials ...
- ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)
ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...
- 『Python基础-1 』 编程语言Python的基础背景知识
#『Python基础-1 』 编程语言Python的基础背景知识 目录: 1.编程语言 1.1 什么是编程语言 1.2 编程语言的种类 1.3 常见的编程语言 1.4 编译型语言和解释型语言的对比 2 ...
- 初学Direct X(10)—— D3D基础预备知识
初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...
- checklist和基础安全知识
checklist和基础安全知识 https://book.yunzhan365.com/umta/rtnp/mobile/index.html 网络安全科普小册子 http://sec.cuc.ed ...
- Java基础语法知识你真的都会吗?
第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...
随机推荐
- 为什么引入Memcached?
刚memcached了解学习,一直是处于一个懵懂的状态,先是对memcached进行了一个了解,但我们为什么要在ITOO中引入memcached呢?当问我的时候当时自己脑子中打了一个大大的 这就必须去 ...
- test20190829 神大校赛模拟
100+100+0=200,聪明搬题人题面又出锅了. 最短路径(path) 给定有向图,包含 n 个节点和 m 条有向边. 一条A 到 B 的路径是最短路径当且仅当不存在另一条从A 到 B 的路径比它 ...
- test20190725 夏令营测试11
50+80+90=220.(每题满分90) 砍树 小A在一条水平的马路上种了n棵树,过了几年树都长得很高大了,每棵树都可以看作是一条长度为a[i]的竖线段.由于有的树过于高大,挡住了其他的树,使得另一 ...
- 评估预测函数(3)---Model selection(选择多项式的次数) and Train/validation/test sets
假设我们现在想要知道what degree of polynomial to fit to a data set 或者 应该选择什么features 或者 如何选择regularization par ...
- CheckList 如何梳理可减少上线的验证时间(总结篇)
对CheckList的执行发起的思考? (1)功能越来越多,CheckList越补充越多,执行CheckList时间越来越长,如何减少上线的验证时间?(2)减少上线验证的时间外,如何保证质量?上线后少 ...
- 关于jquery的事件委托-bind,live,delegate,on的区别发展
1.bind()方法 (只能给已经存在的元素上绑定事件) 只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件. $('ul li').bind('click', function( ...
- FRCN文本检测(转)
[源码分析]Text-Detection-with-FRCN 原创 2017年11月21日 17:58:39 标签: 659 编辑 删除 Text-Detection-with-FRCN项目是基于py ...
- stm32中使用cubemx配置freertos的信号量大小
在配置freertos的情况下,cubemx会自动计算每个任务.信号,队列和软件定时器的使用堆栈大小,因此要合理规划 信号量默认是88byte 任务根据设定来计算,我默认配置是128,则最终是624b ...
- linux服务器初始化(防火墙、内核优化、时间同步、打开文件数)
#!/bin/bash read -p 'enter the network segment for visiting the server:' ips # 关闭firewalld和selinux s ...
- 洛谷 P2296 寻找道路 题解
每日一题 day42 打卡 Analysis 首先,预处理,把每条边反向. 从终点开始bfs,标记从终点开始可以走到的点. 第二步,枚举每一个点,如果这个点没有被标记,则枚举它的每一条出边(反向后的) ...