线程评级:
  • 0票(s) - 0平均
  • 1
  • 2
  • 3.
  • 4
  • 5
使用Python API进行外部rails编程
# 1
你好,

我在用robodk编程路径时遇到了问题。我的站点看起来像站点png。我的代码是这样的:

代码:
”“”
通过RoboDK Python API控制机器人

参数
----------
HTM = (n,4,4)
齐次变换矩阵从基底到刀架的每一个位置
速度:(n-1)浮动
每个位置之间的速度
”“”

RDK = Robolink()
拷贝文件(“. . \资源\ RDKFiles \ CTTLab。rdk”、“. . \资源\ RDKFiles \ Test.rdk”)
RDK.AddFile(“. . \资源\ RDKFiles \ Test.rdk”)
机器人= RDK。项目('KUKA KR 100-2 P', ITEM_TYPE_ROBOT)
如果不是robot.Valid():
抛出异常('No robot selected or available')

reference = robot.Parent().Parent()

#创建一个新程序
程序= RDK。AddProgram(“测试”,机器人)

#关闭自动渲染
RDK.Render(假)

指定你想要使用的参考系
program.setPoseFrame(参考)

定义一个参考姿势
targetname = '目标Home'
target_home = RDK。AddTarget(targetname, reference, robot)
target_home.setJoints (robot.SolveFK (robot.JointsHome ()))
program.MoveJ (target_home)

targetname = '目标0'
target = RDK。AddTarget(targetname, reference, robot)
target.setAsCartesianTarget ()
target.setPose (htm [0])
program.MoveJ(目标)

对于范围(htm)中的I。形状[0]- 1):
targetname = '目标%i' % (i + 1)
target = RDK。AddTarget(targetname, reference, robot)
target.setPose (htm (i + 1))
program.setSpeed(速度[我])
program.MoveJ(目标)

program.RunProgram ()
我得到一个错误:AttributeError: 'numpy。narray ' object没有属性' ishomohomogeneous '
我通过将htm[I]替换为KUKA_2_Pose(Pose_2_KUKA(htm[I +1]))来克服这个问题。但这似乎不是正确的方法。
当运行修正后的程序时,我得到一个错误,目标是遥不可及的。如图所示。

你知道它来自哪里吗?

我尝试了另一种解决方案。实际上,我补充说:
target.setAsJointTarget ()
铁轨最终移动到目标,但它没有到达正确的目标。

谢谢你!


附加文件 缩略图(s)

# 2
我相信您正在为RoboDK API提供numpy矩阵。RoboDK期望4x4矩阵是Mat对象。这个Matrix对象在robodk模块中定义:
//www.sinclairbody.com/doc/en/PythonAPI/robo...robodk.Mat

你可以这样做:
reference = KUKA_2_Pose(list(xyzabc))

其中xyzabc是一个给定X,Y,Z, a,B,C值的1D numpy数组。列表函数将其转换为包含6个值的列表,KUKA_2_Pose将创建一个Mat姿势,您可以将其作为姿势提供给RoboDK。
# 3
你好,
谢谢你的回答。
不幸的是,这并不能解决“目标遥不可及”的问题。怎么了?

我必须保证我完成了目标的放置。它只是说,他们是遥不可及的,而显然他们不是。


附加文件 缩略图(s)

# 4
能否共享RoboDK项目(RDK文件)?
您可能需要为外部轴设置一个值,以便能够到达目标。
# 5
事实上,我自己回答了我的问题。我是这样解决的:
代码:
target_name = '目标%i' % (i + 1)
robot.MoveJ (robot.SolveIK (KUKA_2_Pose (Pose_2_KUKA (htm (i + 1))),工具= RDK。Item('Tool 1', ITEM_TYPE_TOOL).PoseTool())
target = RDK。AddTarget(target_name, reference, robot)
program.setSpeed(速度[我])
program.MoveL(目标)
RDK.Update ()

谢谢你!

马克
# 6
你好,

我将再次回答这个问题。

事实上,我确实用前面的代码解决了这个问题。我有很多点,用这个均值生成需要很长时间。我使用的是MacOS版本的RoboDK,使用API工作的直接方法来创建目标。然而,当回到windows版本时,它仍然不起作用。

我使用的直接代码是这个:

代码:
RDK = Robolink()

机器人= RDK。项目('KUKA KR 100ha ', ITEM_TYPE_ROBOT)
如果不是robot.Valid():
抛出异常('No robot selected or available')

world_base = RDK。Item('World Base', ITEM_TYPE_FRAME)
camera_base = RDK。Item('Camera base', ITEM_TYPE_FRAME)
tool = RDK。Item('Tool 1', ITEM_TYPE_TOOL)

RDK.Render(假)


指定你想要使用的参考系
程序= RDK。AddProgram("{}图片分析".format(name_prog), robot)
program.setPoseFrame (camera_base)
program.setPoseTool(工具)

程序。setSpeed(速度,200,10000,800)

target_name = '接近目标'
pose = Mat(htm[0].tolist())
target = RDK。添加目标(target_name, camera_base, tool)
target.setAsCartesianTarget ()
target.setPose(构成)
program.MoveJ(目标)



对于范围(htm)中的I。形状[0]- 1):
target_name = 'Target {}'.format(i)
pose = Mat(htm[i + 1].tolist())
target = RDK。添加目标(target_name, camera_base, tool)
target.setAsCartesianTarget ()
target.setPose(构成)
program.MoveL(目标)


它生成了以下文件。

当启动程序时,它说目标不可达。

这是文件


附加文件
.rdk M301_01.rdk(大小:1.86 MB /下载:52022世界杯国家队名单91)
# 7
嗨,马克,

当您使用外部轴时,您需要提供外部轴在目标中的位置(使用setjoint)。如果目标是笛卡尔坐标系就不需要考虑机器人的坐标轴。或者,您可以加载一个机器人加工文件,如Gcode或APT,并使用曲线跟踪项目或机器人加工项目。然后,您将能够为外部轴优化工具。

我无法测试你的文件,因为它需要额外的输入数据,但这个小脚本将允许你更新外部轴的位置到一个站的所有目标(例如,5000毫米):

代码:
* # RoboDK API
从robodk导入* #机器人工具箱
RDK = Robolink()

target = RDK.ItemList(ITEM_TYPE_TARGET)

RDK.Render(假)
对于target中的t:
#设置外轴的值
E1 = 5000#,单位mm
t.setJoints ([0, 0, 0, 0, 0, 0, e1))

#根据外部轴的新位置重新计算关节位置
机器人关节更新了,但没有更新外轴
t.setAsCartesianTarget ()
t.Joints ()

jts = t. joint ()
print(t.Name() + "- joint: " + str(jnts.list()))

如果你正在寻找更快的速度(我注意到你已经禁用了渲染),我建议你使用c++ API(稍快)或插件接口来创建一个插件(快得多)。这两种情况下的API几乎是相同的。

艾伯特


附加文件
.rdk M301_01.rdk(大小:1.86 MB /下载:52022世界杯国家队名单15)
# 8
谢谢你的回答,艾伯特。实际上,我不知道外轨的位置,我想让robodk优化这个参数。我该怎么做呢?

另外,奇怪的是,它完全可以在MacOS上工作。
# 9
嗨,马克,

您可以将外部轴的更新封装在另一个循环中,以测试轨道的不同位置(以编程方式)。

命令程序。更新会很快告诉你这个程序是否可行,这样你就可以继续搜索,直到找到一个有效的解决方案。

我更新了你的样本项目,这样做。

艾伯特

代码:
* # RoboDK API
从robodk导入* #机器人工具箱
RDK = Robolink()

#检索所有目标
target = RDK.ItemList(ITEM_TYPE_TARGET)

#选择一个程序(如果只有一个程序,则自动选择)
程序= RDK。ITEM_TYPE_PROGRAM('选择一个程序来检查和更新目标')

#关闭渲染(更快)
RDK.Render(假)

列出一些候选的外轴(E1,单位:mm):
Test_E1 = [500, 1000, 1500, 2000, 2500, 3000, 3500, 4000, 4500]
#test_E1 = range(500, 5000, 500)

对于Test_E1中的e1:
print("测试E1的程序可行性:" + str(E1))

#更新所有目标到所需的e1
对于target中的t:
#设置外轴的值
# e1 = 5000#,单位是mm
t.setJoints ([0, 0, 0, 0, 0, 0, e1))

#根据外部轴的新位置重新计算关节位置
机器人关节更新了,但没有更新外轴
t.setAsCartesianTarget ()
t.Joints ()

jts = t. joint ()
print(t.Name() + "- joint: " + str(jnts.list()))

测试程序,确保它100%可行
valid_ins, prog_time, prog_len, valid_ratio, error_msg = program.Update()
如果valid_ratio < 1.0:
打印("无法完成程序")
Print (" " + error_msg)

其他:
print(“程序可行!”)
#停止寻找
打破

打印(“做!”)
program.RunProgram ()


附加文件
.rdk M301_01 v3.rdk(大小:1.86 MB /下载:42022世界杯国家队名单60)
非常感谢你的帮助。它工作得很好!




浏览此主题的用户:
1客人(年代)