2015-04-14 24 views
2

我正在与百特机器人合作,我正在尝试的是使用增强现实标记获取对象的位置,并将其移动到该位置以便掌握它。ROS框架转换(相机到底座)

我使用的是ar_tools包来获取对象的位置/方向,但是相对于我正在使用的head_camera。最近几天我一直在试验如何将该参考帧(head_camera)更改为基准帧,因为该帧被moveit用于制定计划。我试图从我手动ar_tools收到消息的标题的frame_id设置为'base'

pose_target.header.frame_id = 'base' 

但我正在逐渐依然位置和方向WRT的head_camera。我也试图做的事:

self.tl.lookupTransform("/base", "/head_camera", self.t) 

其中self.t = self.tl.getLatestCommonTime("/head_camera", "/base"),但我得到的推论错误。这是像

的转变需要在过去

推断(我真的不能现在还记得,我不是在实验室里。)然后我想我可能需要运行lookupTransform,从head_camhead,从headtorso和从torso到Baxter的base

有人可以指导我如何将ar_tools标记的帧从head_camera更改为base

另外,对于外推错误,有没有办法以静态的方式做到这一点?

回答

1

有一个稍微straightforwards方式做到这一点,假设你从ar_tools的复活PoseStamped消息:

on_received_pose(pose): 
    ''' 
    Handler for your poses from ar_tools 
    ''' 
    if self.tl.waitForTransform(pose.header.frame_id, "/base", pose.header.stamp, rospy.Duration(0.1)): # this line prevents your extrapolation error, it waits up to 0.1 seconds for the transform to become valid 
     transd_pose = self.tl.transformPose("/base",pose) 
     # do whatever with the transformed pose here 
    else: 
     rospy.logwarn('Couldn\'t Transform from "{}" to "/base" before timeout. Are you updating TF tree sufficiently?'.format(pose.header.frame_id)) 

你越来越有可能推断错误,因为变换网络没有完全形成在你收到你的第一条消息的时候; tf拒绝推断,它只会内插,所以如果你没有收到至少一个你想要转换的时间戳之前和之后(或正好)每帧的转换信息,它将会抛出一个异常。这增加了if语句检查,看它是否可以在尝试这样做之前真正执行转换。您当然也可以在try/catch块中围绕transformPose()呼叫,但我觉得对于tf而言,这使得它更明确地表明您要做的事情。

一般来说,请查看简单的ROS tf Python Tutorial了解更多示例/操作模式。

+0

你好,谢谢,对不起,回复迟!我试过这个,它可以很好地工作,但有一个小问题。我刚刚发现,从ar_pose接收到的消息没有邮票!这里是消息:(http://docs.ros.org/hydro/api/ar_pose/html/msg/ARMarker.html)。有没有办法做到这一点没有时间戳?有没有办法给消息添加时间戳?再次感谢您的快速回复和帮助! – ekptwtos

+0

编辑:对不起,我认为邮件没有时间戳,但是当我打印它时,它返回'邮票:秒:1429124219'所以我想这意味着它有一个! – ekptwtos

+0

这种事情发生在你身上,当你试图提问而你不在实验室时!对不起,aruisdante推断是**未来**而不是**过去**,我猜这个变化很大.. – ekptwtos