线程评级:
在两个目标之间移动并保持工具方向
# 1
嗨,我正在编程一个UR10,用一个六边形的“工具”反复在目标a和B之间来回移动,这个六边形的“工具”的每一面都有一张图片。在目标B上有一个摄像机,它将拍摄图片。每N个循环,我想旋转工具到不同的图片,而它在目标a(相机的视野之外)。在旋转工具后,机器人会对新图片重复这个循环。

我遇到的问题是工具总是旋转到所需的图像,而它移动到目标B和旋转回第一个图像,而它返回到目标A。

相反,我需要它:
  1. 从目标A开始
  2. 旋转工具到所需的图像
  3. 移动到目标B,同时保持方向
  4. 保持航向,返回目标A
  5. 重复步骤3和4 N次
  6. 旋转工具到下一个想要的图像(在目标A处)
  7. 重复步骤3-6,直到显示所有图像。
我有一个简单的程序称为“show_from_right”在RoboDK GUI中定义,它执行a和b之间的移动。我使用Python来调用这个程序,并运行代码来改变在程序调用之间显示的图像。下面的图片(下一篇文章)显示了设置。下面是更改显示图片的代码(它在API的包装器中运行)

代码:
set_picture(self, new_pic_idx):
"""旋转工具,使给定的new_pic_idx是将显示给相机的图片"""
new_pic_angle = (new_pic_idx - 1) * -self.deg_per_idx #计算新的图片角度
New_pose = robomath。rotz(new_pic_angle * self.d2r) #计算新的姿态(d2r转换角度为弧度)
result = self.robot.setPoseTool(new_pose) #移动机器人到新的姿态
自我。current_pic_idx = new_pic_idx #更新当前图片索引
self.robot.WaitMove(超时= 5000)

希望有人能帮助我理解我在这里做错了什么!

setPoseTool不是一个会引起机器人运动的命令。该功能仅更新RoboDK中的Tool (TCP),如果连接了驱动程序,则更新真实机器人。

您应该使用MoveJ或moveel命令移动机器人。例子:
代码:
...
robot.setPoseTool(new_tool) #更新TCP
...
robot. movej (new_pose) #移动机器人。默认为阻塞
# 3
谢谢你的回复!我已经更新了我的代码,这里是我现在的位置:

当我从python (jupyter)调用set_picture(pic_idx)时,工具立即旋转到选定的图像,太棒了!


每当我使用set_picture在一个动作中旋转工具180度(例如,从图1 -> 4移动),机器人就会发疯,试图把自己拧成椒盐卷饼。我可以进行增量移动(1 -> 3 -> 5),当总和超过180时就可以了;或者如果我按1 -> 6,它会转到相反的方向,没有问题。我甚至尝试添加一些逻辑,增加或减少1度,如果新的角度是abs(180),导致-179度或179度,这仍然会导致机器人发疯。我哪里做错了?


以下是更新后的代码:
代码:
self.deg_per_idx = 360/6 #用360度除以六边形的6条边
自我。d2r = 0.017453292519943295 # Myltiply通过该值将角度转换为弧度

set_picture(self, new_pic_idx):
"""旋转工具,使给定的new_pic_idx是将显示给相机的图片"""
#下一行计算从当前pic_idx到新pic_idx旋转多少度
New_pic_angle =((自我。Current_pic_idx - 1) * -self.deg_per_idx) - ((new_pic_idx - 1) * -self.deg_per_idx)
curr_pose = self.robot.Pose() #获取机器人的当前姿态
New_pose = robomath。rotz(new_pic_angle * self.d2r) #计算新的姿态(d2r转换角度为弧度)
Result = self.robot。移动机器人到新的姿态
自我。current_pic_idx = new_pic_idx #更新当前图片索引
self.robot.WaitMove(超时= 5000)
# 4
我决定把一个180度的旋转分解成两个90度的旋转,这样机器人就不会偏离轨道。这并不理想,因为它在旋转过程中会暂停,但这不会影响我的测试,所以我就这样使用它。
# 5
这是我的新代码。它能给我想要的结果!但这似乎过于复杂了。

我旋转工具,然后修改TCP,使其与我想要显示的图片和相机目标对齐。

我愿意听取更优雅的方法的建议——或者让我知道这是否真的是正确的方法。

代码:
set_picture(self, new_pic_idx):
"""旋转末端执行器,使给定的new_pic_idx是将显示给相机的图片"""
如果0 < new_pic_idx <= self。num_pic_idx and isinstance(new_pic_idx, int): #如果新的图片索引有效
New_pic_angle =((自我。Current_pic_idx - 1) * -self.deg_per_idx) - ((new_pic_idx - 1) * -self.deg_per_idx)
new_tcp_angle = (new_pic_idx - 1) * -self.deg_per_idx #我不知道为什么我必须以不同的方式计算这个,但它是有效的

如果角度是180度,会让机器人感到困惑,所以我们将移动分为2个-90度的移动(+90度会导致问题)
如果abs(new_pic_angle) == 180:
对于范围(2)中的_:
Half_angle = -90
curr_pose = self.robot.Pose() #获取机器人的当前姿态
New_pose = robomath。rotz(half_angle * self.d2r) #生成旋转矩阵
self.robot。移动机器人到新的姿态
其他:
curr_pose = self.robot.Pose() #获取机器人的当前姿态
New_pose = robomath。rotz(new_pic_angle * self.d2r) #生成旋转矩阵
self.robot。移动机器人到新的姿态

Tcp_pose = robomath。rotz(new_tcp_angle * self.d2r) #为TCP生成旋转矩阵
self.robot.setPoseTool(tcp_pose) #设置新的TCP
self.robot.WaitMove(超时= 5000)
自我。current_pic_idx = new_pic_idx #更新当前图片索引




浏览此线程的用户:
1客人(年代)