仅做一下记录,因为这个我折腾了好久,防止忘记
参考
http://docs.ros.org/jade/api/tf/html/python/tf_python.html
http://docs.ros.org/kinetic/api/tf/html/python/tf_python.html#transformerros
http://docs.ros.org/api/geometry_msgs/html/index-msg.html
http://docs.ros.org/jade/api/tf/html/c++/classtf_1_1StampedTransform.html

C++版本

监听tf的关系

try{this->tf_camera_to_robot.waitForTransform("/base_link", "/camera_link", ros::Time(0), ros::Duration(50.0));}catch (tf::TransformException &ex){ROS_ERROR("[adventure_tf]: (wait) %s", ex.what());ros::Duration(1.0).sleep();}try{this->tf_camera_to_robot.lookupTransform("/base_link", "/camera_link", ros::Time(0), (this->camera_to_robot_));}catch (tf::TransformException &ex){ROS_ERROR("[adventure_tf]: (lookup) %s", ex.what());}

其中


#include <geometry_msgs/PoseStamped.h>
#include <tf/transform_listener.h>/*** @brief camera_to_robot takes care of the transformation from camera to robot frame*/tf::StampedTransform camera_to_robot_;/*** @brief tf_camera_to_robot is an instance of tf_listener*/tf::TransformListener tf_camera_to_robot;/*** @brief obj_camera_frame, obj_robot_frame are instance of tf::Vector*/tf::Vector3 obj_camera_frame, obj_robot_frame;

使用

    // ROS_INFO("Image Message Received");float obj_x, obj_y;vMng_.get2DLocation(cv_ptr->image, obj_x, obj_y); #图像处理得到的2d坐标// Temporary Debuggingstd::cout<< " X-Co-ordinate in Camera Frame :" << obj_x << std::endl;std::cout<< " Y-Co-ordinate in Camera Frame :" << obj_y << std::endl;// 坐标变换,模型决定obj_camera_frame.setZ(-obj_y);obj_camera_frame.setY(-obj_x);obj_camera_frame.setX(0.45);利用前边得到的tf转换关系求得一个点在另一坐标系中的坐标obj_robot_frame = camera_to_robot_ * obj_camera_frame;

Python 版本

读取tf关系

        self.tf_camera_to_robot = tf.TransformListener()got_tf = Falsewhile not got_tf:try: # 如果查询得到的话,就将结果保存到camera_to_robot_,保存x,y,z和四元数一共7个值(self.trans,self.rot) = self.tf_camera_to_robot.lookupTransform("/base_link", "/camera_link", rospy.Time(0))rospy.loginfo("[adventure_tf]: got")got_tf = Trueexcept (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):rospy.loginfo("[adventure_tf]: (wait)")rospy.sleep(1.0)
import tf
from geometry_msgs.msg import PoseStamped, Pose, PointStamped, Point

使用

            rospy.loginfo("Image Message Received")# 调用vision_manager中的函数获取目标的位置,位置坐标是以摄像头中心点的位置作为0坐标obj_x, obj_y = self.vMng_.get2DLocation(cv_image)print(" X-Co-ordinate in Camera Frame : ", obj_x)print(" Y-Co-ordinate in Camera Frame : ", obj_y)# 通过坐标变换,将二维坐标变换为相机坐标系下的三维坐标,在本程序中与URDF建模有关系obj_camera_frame  = PointStamped(header=rospy.Header(stamp = rospy.get_rostime(),frame_id="/camera_link"), point=Point(x=0.45,y=-obj_x,z=-obj_y))print("obj_camera_frame",obj_camera_frame)# 关键的一行代码,将相机坐标系下的位置转化为base_link坐标系下的坐标obj_robot_frame = self.tf_camera_to_robot.transformPoint(target_frame="/base_link", ps=obj_camera_frame)print("obj_robot_frame_tf",obj_robot_frame)

ros 中对一个点利用tf工具旋转,python or C++相关推荐

  1. 平面中,一个点绕任意点旋转θ度后的坐标(C++实现)

    平面中,一个点(x,y)绕任意点(dx,dy)顺时针旋转a度后的坐标 xx= (x - dx)*cos(-a) - (y - dy)*sin(-a) + dx ; yy= (x - dx)*sin(- ...

  2. Heartrate:一个牛逼的工具,Python执行实时可视化

    实时堆栈追踪(stacktrace) Heartate--如监测心率般追踪程序运行 项目地址:https://github.com/alexmojaki/heartrate (点击阅读原文即可访问) ...

  3. 用 Python 的GUI 库 PySimpleGUI,写一个肥胖指数计算工具,Python开发就是这么简单

    Python 的 GUI 库 PySimpleGUI,写一个简单的有界面的小工具很简单!这里我们来写一个计算肥胖指数(BMI)的小工具.首先,通过百度得到 BMI 指数的计算公式为: 体重 / (身高 ...

  4. python代码覆盖率测试_利用coverage工具进行Python代码覆盖率测试

    Coverage是一种用于统计Python代码覆盖率的工具,通过它可以检测测试代码对被测代码的覆盖率情况. Coverage安装 1.安装命令:pip install coverage 2.查看cov ...

  5. ros中有关欧拉角和四元数互转的python写法

    1.欧拉角转四元数 如:pos = Pose() q = tf.transformations.quaternion_from_euler(0, 0, point.z) pos.orientation ...

  6. python制作安装包_利用setupTool工具制作python安装包

    编写完成的python库源代码,需要进行制作python安装包,方便更新版本.方法记录如下: 1.新建一个目录结构如下的目录: --src ----TestLibrary ----TestLibrar ...

  7. 求在平面直角坐标系中,一个点绕坐标原点旋转一定角度后点的坐标

    如图,在平面直角坐标系中(忽略坐标轴上的刻度值),求坐标点P0(x0, y0)绕坐标原点旋转角度B后得到新的点的坐标P1(x1, y1).这是最基本的坐标点绕坐标原点旋转问题,通过这样的思想我们还可以 ...

  8. ROS中的TF坐标变换

    坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护.一个机器人系统通常有很多三维坐标系,而且会随时间的推移发生变化,如世界坐标系(World Frame).基坐标系(Base ...

  9. ROS学习-创建一个ROS msg和一个srv

    目录 ROS msg和srv的介绍 使用msg 创建一个msg 使用rosmsg命令 使用srv 创建一个srv 使用rossrv命令 msg和srv的通用步骤 使用Help 简要总结回顾 ROS m ...

最新文章

  1. java应用中spring自动注入_java-Spring Security会自动过滤注入吗?
  2. Valgrind 快速入门
  3. 【Apache】 alias+proxy 将资源路径指向某个本地目录
  4. 自定义checkbox样式
  5. 目标检测排行榜_3D领域重大突破!大华股份人工智能取得KITTI Object 3D车辆检测排行榜第一名...
  6. (转)淘淘商城系列——在业务逻辑中添加缓存
  7. ngxin做http强制跳转https,接口的POST请求变成了GET
  8. 树状数组区间修改和区间求和
  9. 第四季-专题20-SPI驱动程序设计
  10. Flex创建弹出菜单(PopUpButton/Menu/PopMenuButton)
  11. cad插件加载bplot成功用不了_教大家Batchplot使用常见问题的解决办法
  12. linux 系统中没有rpm命令
  13. 什么是路由器 路由器和路由器之间怎么连接
  14. 算符优先算法c语言,c语言实现算符优先语法分析
  15. android 进球数据布局,10个有趣的数据,总结梅西令人难以置信的2018-19赛季!
  16. 盘点 11 月火火火火的 GitHub 项目
  17. linux arena参数设置,从零开始的Linux堆利用(三)
  18. ARM_UART 串行通讯基础知识及编程
  19. 使用 VMware-Workstation-9 或者 Vmware10 安装 fedora9时卡住了
  20. Redis集群master节点挂掉之后的处理方式

热门文章

  1. 智能车竞赛技术报告 | 双车接力组 - 沈阳航空航天大学 - 精神小车成双 - 三轮车
  2. 第十六届全国大学生智能汽车竞赛 讯飞智慧餐厅 全国总决赛竞赛规则
  3. 基于ESP32的竞赛裁判系统功能调试-激光信号调试
  4. 2021年春季学期-信号与系统-第八次作业参考答案-第五小题
  5. 使用WinSCP在WIndows与树莓派之间传递文件
  6. linux手机刷机包制作工具_刷GitHub提交记录工具制作
  7. php5.6 64位配置,centos(64位) 安装PHP5.6,配置LNMP
  8. html页面不显示横向滚动条,css横向滚动条不显示?
  9. asp.net mysql 读写分离_.NET Core实现分表分库、读写分离的通用 Repository功能
  10. 硬盘突然提示没有初始化_分享一下固态硬盘不认盘的修复方法