2015-04-14 22 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