在两个目标之间移动并保持刀具方向-dunderMethods-02-22-2023
嗨,我正在编程一个UR10反复来回移动的目标a和B与六边形的“工具”,有一个图片在它的每一个6面。在目标B有一个相机,它会看图片。每N个周期,我想要旋转工具到一个不同的图片,而它是在目标a(在相机的视图)。旋转刀具后,机器人用新图片重复这个循环。
我遇到的问题是,该工具总是旋转到所需的图像,而它移动到目标B,并旋转回第一个图像,而它返回到目标A。
相反,我需要它:
- 从目标A开始
- 旋转工具到所需的图像
- 保持方向移动到目标B
- 返回目标A,同时保持方向
- 重复步骤3和4 N次
- 旋转工具到下一个所需的图像(当在目标A时)
- 重复步骤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)
希望有人能帮助我了解我在这里做错了什么! (附件= 4042) (附件= 4043)
RE:在两个目标之间移动并保持工具方向-艾伯特-02-22-2023
setPoseTool不是一个会引起机器人运动的命令。此功能仅在与驱动程序连接的情况下更新RoboDK中的Tool (TCP)和真实机器人。
您应该使用MoveJ或MoveL命令来移动机器人。例子:
代码:
… robot.setPoseTool(new_tool) #更新TCP … #移动机器人。默认阻塞
RE:在两个目标之间移动并保持工具方向-dunderMethods-02-22-2023
谢谢你的回复!我已经更新了我的代码,这是我现在的位置:
当我从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)
RE:在两个目标之间移动并保持工具方向-dunderMethods-02-24-2023
我决定将单个180度旋转分解为两个90度旋转,这样机器人就不会脱轨了。它不是理想的,因为它在旋转的中途暂停,但这不会影响我的测试,所以我就这样用它。
RE:在两个目标之间移动并保持工具方向-dunderMethods-02-24-2023
这是我的新代码。它给了我想要的结果!但这似乎过于复杂了。
我旋转工具,然后修改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 #更新当前图片索引
|