RoboDK论坛
如何获得和设置移动指令的“目标链接”项?-打印版本

+- RoboDK论坛(//www.x7093.com/forum
+——论坛:RoboDK (EN) (//www.x7093.com/forum/Forum-RoboDK-EN
+——论坛:RoboDK API (//www.x7093.com/forum/Forum-RoboDK-API
+——线程:如何获得和设置移动指令的“目标链接”项?(/ Thread-How-to-get-set-the-Target-linked-item-of-a-move-instruction



如何获得和设置移动指令的“目标链接”项?-Maarten-02-17-2022

我如何获得一个程序的移动指令的“目标链接”项?目标和移动指令是在GUI中创建的,我想通过API获取链接的目标项。

我发现我可以使用' instruction()'获得指令的几个参数:

代码:
p = RDK.Item('myProgram',ITEM_TYPE_PROGRAM)
ins_name, ins_type, move_type, isjointarget, pose,关节= p.指令(2)#选择'2',第三条指令

但是,这并没有提供链接的目标项。此外,输出'pose'似乎是根据被链接的目标项的第一个父参考框架定义的,但如果我不能确定指令链接到哪个目标项,那么我也不能确定'pose'的参考框架。

这个问题的第二部分是:我如何通过API更改/设置“目标链接”项目到不同的目标项目?(也就是说,不只是改变指令的“姿势”,而是改变实际的目标项目)。类似于在GUI的右键单击如下所示的指令菜单中所实现的:

(附件= 3014)

最好的问候,

Maarten


回复:如何获得和设置移动指令的“目标链接”项?-山姆-02-18-2022

嗨Mearten,

你在正确的道路上!

目前,不可能通过API直接编辑链接的目标项。
你得把说明书换成新的。

下面是一个示例代码,可以让您了解这个概念。

代码:
进口robolink
RDK = robolink.Robolink()

prog = RDK。“选择要编辑的程序”,robolink.ITEM_TYPE_PROGRAM)
old_target = RDK。ItemUserPick("Select target to replace", robolink.ITEM_TYPE_TARGET)
new_target = RDK。ItemUserPick("选择新目标",robolink.ITEM_TYPE_TARGET)

inst_count = prog.InstructionCount()
对于range(inst_count)中的I:
instruction_dict = prog.setParam(i)
if instruction_dict['Type'] == robolink。INS_TYPE_MOVE:
if old_target.Name() in instruction_dict['Name']:
prog.InstructionSelect(i) #选择要替换的指令
prog.MoveJ(new_target) #添加新指令(正确使用moveel或MoveJ)
掠夺。setParam(i, {'Type': -1}) #删除指令
i += 1 #重置指令指针

您可以在文档中找到更多信息


回复:如何获得和设置移动指令的“目标链接”项?-Maarten-02-18-2022

嗨,山姆,

谢谢你的帮忙。您的代码示例是不是有点冒险,因为您假设指令的名称包含目标的名称?

代码:
if old_target.Name() in instruction_dict['Name']:

默认情况下,联合移动指令的名称确实包含目标的名称。“MoveJ (targetName)”。但是用户可以自由地重命名指令。另外,用户可以在创建指令后重命名目标。如果没有目标名称作为指令名称的一部分,您的代码示例将错过链接。

(代码也会给出一个假阳性,例如。MoveJ (target10),其中包含“target1”和“target10”的名称。但这可以通过一个更具体的字符串比较来解决。)

除了作为指令名称一部分的目标项的名称之外,指令中链接的目标项是否没有其他指示符?

最好的问候,

Maarten


回复:如何获得和设置移动指令的“目标链接”项?-Maarten-02-18-2022

我刚刚发现,GUI中移动指令的名称会自动更新,以匹配默认名称和链接目标的名称(如果更改则更新),在Python脚本中运行下面这些行:

代码:
从robolink导入* # RoboDK API
RDK = Robolink()

p = RDK.Item('myProgram',ITEM_TYPE_PROGRAM)
ins_dict = p.setParam(2) #获取第三条指令
打印(ins_dict)
p.setParam(2,ins_dict) #设置第三条指令为我刚刚得到的
ins_dict = p.setParam(2) #再次获取第三条指令
打印(ins_dict)

所以我有一个(第三)指令和目标:
"MoveJ (target1)"和"target1"
我在GUI中手动更改指令名称和目标名称为:
“MoveJA (target1B)”及“target1C”
然后我运行上面的代码,指令的名称会自动更新为:
"MoveJ (target1C)"和"target1C"

也许水下的某些东西得到了更新?如果指令的命名实际上是由此强制执行的,那么从指令的名称中检索链接的目标项可能是一个可行的选项。


回复:如何获得和设置移动指令的“目标链接”项?-山姆-02-18-2022

实际上,我提供的示例代码并不健壮。
在API中添加更方便的方法之前,它是作为一种变通方法提供的。
你必须使它适应你的需要。

为了使其更加健壮,您可以检索所需的目标姿态并将其与指令姿态进行比较。
如果名称和姿势匹配,很可能您正在替换正确的指令。

其他解决方法:
  • 创建两个具有不同目标的程序
  • 使用所需的目标Item,通过API从头创建程序