我正在与Baxter机器人合作,我想要做的是使用增强现实标记获取物体的位置,并将手移动到该位置以便抓住它。
我使用ar_tools
包来获取对象的位置/方向,但是相对于我正在使用的head_camera
。过去几天我一直在尝试如何将参考框架(head_camera
)更改为基础框架,因为moveit
使用此框架来制定计划。我尝试将frame_id
手动收到的邮件标题的ar_tools
设置为'base'
:
pose_target.header.frame_id = 'base'
但我得到的位置和方向仍然是head_camera
。我也尝试过:
self.tl.lookupTransform("/base", "/head_camera", self.t)
其中self.t = self.tl.getLatestCommonTime("/head_camera", "/base")
,但我得到了一个推断错误。这就像
转型需要在过去进行推断
(我现在真的不记得,而且我不在实验室里。)然后我想我可能需要从lookupTransform
到{{1}运行head_cam
},从head
到head
,从torso
到Baxter' s torso
。
有人可以指导我如何将base
标记的框架从ar_tools
更改为head_camera
吗?
另外,对于外推错误,有没有办法以静态方式执行此操作?
答案 0 :(得分:1)
有一种稍微简单明了的做法,假设您正在从PoseStamped
恢复ar_tools
条消息:
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 Tutorial以获取更多示例/操作模式。