线程评级:
使用Python API的外部rails编程
# 1
你好,

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

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

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

RDK = Robolink()
拷贝文件(“. . \资源\ RDKFiles \ CTTLab。rdk”、“. . \资源\ RDKFiles \ Test.rdk”)
RDK.AddFile(“. . \资源\ RDKFiles \ Test.rdk”)
机器人= RDK。Item('KUKA KR 100-2 P', ITEM_TYPE_ROBOT)
如果不是robot.Valid():
raise异常('没有选择或可用的机器人')

reference = robot.Parent().Parent()

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

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

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

#定义一个参考姿势
targetname = 'Target Home'
target_home = RDK。添加目标(目标名称,引用,机器人)
target_home.setJoints (robot.SolveFK (robot.JointsHome ()))
program.MoveJ (target_home)

targetname = '目标0'
target = RDK。添加目标(目标名称,引用,机器人)
target.setAsCartesianTarget ()
target.setPose (htm [0])
program.MoveJ(目标)

对于I在范围(htm。形状[0]- 1):
Target = '目标%i' % (i + 1)
target = RDK。添加目标(目标名称,引用,机器人)
target.setPose (htm (i + 1))
program.setSpeed(速度[我])
program.MoveJ(目标)

program.RunProgram ()
我得到一个错误:AttributeError: 'numpy。ndarray对象没有“同构”属性
我通过用KUKA_2_Pose(Pose_2_KUKA(htm[I +1]))替换htm[I]来克服这个问题。但这似乎不是正确的方式。
当运行正确的程序时,我得到一个错误,目标是不可及的。如所附图片所示。

你知道它从何而来吗?

我尝试了另一种解决方案。实际上,我补充了以下内容:
target.setAsJointTarget ()
轨道最终移动到目标,但它没有到达适当的目标。

谢谢你!


附加文件 缩略图(s)

我相信你正在为RoboDK API提供numpy矩阵。RoboDK期望4x4矩阵是Mat对象。这个Matrix对象是在robodk模块中定义的:
//www.w5838.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 = '目标%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。Item('KUKA KR 100 HA', ITEM_TYPE_ROBOT)
如果不是robot.Valid():
raise异常('没有选择或可用的机器人')

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(假)


#指定你想使用的参考系
program = 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。AddTarget(target_name, camera_base, tool)
target.setAsCartesianTarget ()
target.setPose(构成)
program.MoveJ(目标)



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


它生成以下文件。

当启动程序时,它会说目标无法到达。

这是文件


附加文件
.rdk M301_01.rdk(大小:1.86 MB /下载:512)
# 7
嗨,马克,

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

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

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

目标= RDK.ItemList(ITEM_TYPE_TARGET)

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

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

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

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

艾伯特


附加文件
.rdk M301_01.rdk(大小:1.86 MB /下载:431)
# 8
谢谢你的回答,艾伯特。其实我不知道外轨位置,我想让robodk来优化这个参数。我该怎么做呢?

另外奇怪的是,它完全可以在MacOS上以这种方式运行。
# 9
嗨,马克,

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

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

为此,我更新了示例项目。

艾伯特

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

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

#选择一个程序(如果只有一个程序则自动选择)
program = RDK。ItemUserPick('选择一个程序检查和更新目标',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中的for e1:
print("测试E1的程序可行性:" + str(E1))

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

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

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

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

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

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


附加文件
.rdk M301_01 v3.rdk(大小:1.86 MB /下载:384)
非常感谢你的帮助。它工作得很好!




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