ROS帧转换(相机到底座)



我正在使用Baxter机器人,我想做的是使用增强现实标记获取物体的位置,并将手移动到该位置以抓住它。

我使用ar_tools包来获取对象的位置/方向,但这是相对于我使用的head_camera。在过去的几天里,我一直在尝试如何将参考框架(head_camera)更改为基本框架,因为moveit使用该框架来制定计划。我已尝试手动将我从ar_tools接收的消息头的frame_id设置为'base':

pose_target.header.frame_id = 'base'

但是我得到的位置和方向仍然是WRThead_camera。我也尝试过:

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

其中self.t = self.tl.getLatestCommonTime("/head_camera", "/base"),但我得到了一个外推误差。它有点像

转换需要在过去的中外推

(我现在记不清了,也不在实验室。)然后我想我可能需要从head_camhead、从headtorso以及从torso到Baxter的base运行lookupTransform

有人能指导我如何将ar_tools的标记框从head_camera改为base吗?

此外,对于外推误差,有没有一种方法可以以静态的方式做到这一点?

有一种更直接的方法可以做到这一点,假设您正在从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语句在尝试执行转换之前会检查它是否真的可以执行转换。当然,您也可以将transformPose()调用包围在try/catch块中,但我觉得对于tf,这会使它更明确地说明您要执行的操作。

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

最新更新