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

ROS与C++入门教程-tf-坐标变换

说明:

  • 介绍在c++实现TF的坐标变换

概念:

  • Coodinate Frames (坐标框架,坐标系)
  • Transforms (变换)
  • TF

参考:

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)

(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()

geometry_msgs/QuaternionStamped

transformVector()

transformVector3()

geometry_msgs/Vector3Stamped

transformPoint()

transformPoint()

geometry_msgs/PointStamped

transformPose()

transformPose()

geometry_msgs/PoseStamped

transformPointCloud()

transformPointCloud()

sensor_msgs/PointCloud

  • 基本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基础使用知识的更多相关文章

  1. 论Linux运维的一些基础安全知识和简单办法

    不知不觉本人来北京也已经第三个年头了,从一个Linux小小鸟,开始,2012年我参加了第一份工作,其实现在想想其实我是幸运的,本来求学的时候,就没好好的学Linux,我认为有Cisco知识从上wind ...

  2. JAVA面向对象-----面向对象(基础预备知识汇总)

    终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...

  3. ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera

    ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera 软件包下载地址:https://github.com/bosch-ros-pkg/usb_cam 下载后, ...

  4. ROS_Kinetic_11 ROS程序基础Eclipse_C++(二)

    ROS_Kinetic_11 ROS程序基础Eclipse_C++(二) 编写简单的Service和Client (C++): http://wiki.ros.org/cn/ROS/Tutorials ...

  5. ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)

    ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...

  6. 『Python基础-1 』 编程语言Python的基础背景知识

    #『Python基础-1 』 编程语言Python的基础背景知识 目录: 1.编程语言 1.1 什么是编程语言 1.2 编程语言的种类 1.3 常见的编程语言 1.4 编译型语言和解释型语言的对比 2 ...

  7. 初学Direct X(10)—— D3D基础预备知识

    初学Direct X(10) -- D3D基础预备知识 1. 像素格式 D3DFMT_X8R8G8B8(F) X:未加使用 8:8位用于显示 B:用于显示蓝色 F:浮点像素类型 以下三个较为常用,使用 ...

  8. checklist和基础安全知识

    checklist和基础安全知识 https://book.yunzhan365.com/umta/rtnp/mobile/index.html 网络安全科普小册子 http://sec.cuc.ed ...

  9. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

随机推荐

  1. 收起.NET程序的dll来

    作为上床后需要下床检查好几次门关了没有的资深强迫症患者,有一个及其搞我的问题,就是dll问题. 曾几何时,在没有nuget的年代,当有依赖项需要引用的时候,只能通过文件引用来管理引用问题,版本问题,更 ...

  2. 基于h5+的微信分享,hbuilder打包

    1.打开app项目的manifest.json的文件,选择模块权限配置,将Share(分享)模块添加至已选模块中 2.选择SDK配置,在plus.share·分享中,勾选□ 微信消息及朋友圈,配置好a ...

  3. IPV4地址耗尽,了解IPV6。

    北京时间 2019 年 11 月 26 日下午,负责互联网资源分配的最后一个信息中心——欧洲网络信息中心(RIPE NCC)宣布耗尽了最后一个 IPv4 地址区块,至此,全球所有 43 亿个 IPv4 ...

  4. VS Code中配置Markdown

    其实,对我来说是反过来的,我是为了使用Markdown而安装VS Code(虽然久仰大名) 安装VS Code 安装Markdown插件 使用篇 1. 安装vscode 之所以啰嗦一下,是因为据说安装 ...

  5. SpringBoot官方文档学习(三)配置文件、日志、国际化和JSON

    一.Profiles Spring配置文件提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用.任何@Component.@Configuration或@ConfigurationPr ...

  6. grep命令选项

    -c:只输出匹配行的计数. -I:不区分大 小写(只适用于单字符). -h:查询多文件时不显示文件名. -l:查询多文件时只输出包含匹配字符的文件名. -n:显示匹配行及 行号. -s:不显示不存在或 ...

  7. sql server 行转列和列转行的使用

    1: 行转列 子查询,获取一定数据集结果 SELECT objid,action,count(1) AS [count] FROM T_MyAttention WHERE objid IN(SELEC ...

  8. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

  9. ASM磁盘组的监控

    ASM磁盘组的监控可以使用oracle数据库查询,需要使用到的是sql语句和oracle数据库的相关操作. 还可以使用命令行进行查询,然后用awk进行文本拆分,拿到需要的值.这个需要使用到的是sudo ...

  10. C二维数组用指针地址遍历

    #include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf ...