线程评级:
  • 0票(s) - 0平均
  • 1
  • 2
  • 3.
  • 4
  • 5
在两个目标之间移动并保持刀具方向
# 1
嗨,我正在编程一个UR10反复来回移动的目标a和B与六边形的“工具”,有一个图片在它的每一个6面。在目标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周围的包装器中运行)

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

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

# 2
setPoseTool不是一个会引起机器人运动的命令。此功能仅在与驱动程序连接的情况下更新RoboDK中的Tool (TCP)和真实机器人。

您应该使用MoveJ或MoveL命令来移动机器人。例子:
代码:

robot.setPoseTool(new_tool) #更新TCP

#移动机器人。默认阻塞
# 3
谢谢你的回复!我已经更新了我的代码,这是我现在的位置:

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


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


以下是更新后的代码:
代码:
用360度除以六边形的6条边
自我。d2r = 0.017453292519943295 #乘以此值将度转换为弧度

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

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

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

代码:
Def 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 = (self。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:
For _in range(2):
Half_angle = -90
curr_pose = self.robot.Pose() #获取机器人的当前姿势
New_pose =机器人。rotz(half_angle * self.d2r) #生成旋转矩阵
self.robot。MoveJ(curr_pose * new_pose) #移动机器人到新的姿势
其他:
curr_pose = self.robot.Pose() #获取机器人的当前姿势
New_pose =机器人。rotz(new_pic_angle * self.d2r) #生成旋转矩阵
self.robot。MoveJ(curr_pose * new_pose) #移动机器人到新的姿势

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客人(年代)