RoboDK API for Matlab

内容

这是一个使用Matlab的RoboDK API的例子。这个例子并不打算展示一个特定的应用程序,只是如何%与API交互这是一个。m文件(Matlab文件)。用于Matlab的RoboDK API需要此文件夹中的文件。%此示例要求RoboDK正在运行%(否则,如果安装在默认位置,将启动RoboDK)%此示例自动加载默认安装在“Library”文件夹中的示例01注:这个程序不是为了完成一个特定的目标,只是为了%演示如何使用Matlab API% RoboDK api帮助:% ->键入“doc Robolink”以获取有关Robolink类的更多帮助% ->键入“doc RobolinkItem”以获取有关RobolinkItem项目类的更多帮助% ->键入“showdemo Example_RoboDK”以获取如何使用RoboDK的API的示例CLC清除关闭所有%生成Robolink对象RDK。该对象与RoboDK接口。RDK = Robolink;%获取库路径% path = "C:\RoboDK\Library";从RoboDK 5.5开始,PATH_LIBRARY指向Documentspath = RDK.getParam(“PATH_LIBRARY”);%打开示例1% RDK。AddFile([path,'Example 01 - Pick and place.rdk']);在RoboDK 4.0.0之前RDK。AddFile([路径,“Example-06。挑选并摆放两张桌子。]);%显示所有项目的列表流(“站内可用物品:\n”);disp (RDK。ItemList (1,1));按名称获取一个项目程序= RDK。项目(“挑选和放置”, RDK.ITEM_TYPE_PROGRAM);启动“拾取和放置”程序program.RunProgram ();%运行程序的可选调用% program = RDK。项目(“挑选和放置”).RunProgram();运行相同程序的另一个可选调用% RDK。RunProgram('Pick and place');%返回;
站内可用项目:列1至列3{'示例1 - Pic…'}{'ABB IRB 1600-8/…'}{'ABB IRB 1600-8/…'}}列4至列8{'工具'}{'表1'}}{'方法'}{'目标b1'}}{'目标b2'}列9至列13{'目标b3'}{'目标b4'}{'目标b5'}{'基础'}{'球1'}列14至列18{'球2'}{'球3'}{'球4'}}{'球5'}{'表2'}19至列21{'基础'}{'拾取和放置'}{'替换物体'}

从站点检索对象并修改它们

在车站找到一些物品的名字。控件中可以看到每个项%当前项目树机器人= RDK。项目(' abb irb 1600-8/1.45', RDK.ITEM_TYPE_ROBOT);流(“机器人选择:\ t % s \ n”robot.Name ());robot.setVisible (1);我们可以通过调用以下命令来验证每个项目的类型:% robot.Type ()我们可以使用PoseAbs()检索相对于站点的物品位置。% robot.PoseAbs ()frameef = robot.Parent();流(“选定的机器人参考:\t%s\n”frameref.Name ());object = RDK。项目(“基地”, RDK.ITEM_TYPE_OBJECT);流(的对象选择:\ t % s \ n”object.Name ());球= RDK。项目(“球”);流(“球选择:\ t % s \ n”ball.Name ());frametable = RDK。项目(“表1”, RDK.ITEM_TYPE_FRAME);流(“表选择:\ t % s \ n”frametable.Name ());tool = RDK。项目(“工具”, RDK.ITEM_TYPE_TOOL);流(选择“工具:\ t % s \ n”tool.Name ());target1 = RDK。项目(“目标b1”, RDK.ITEM_TYPE_TARGET);流('选定目标1:\t%s\n'target1.Name ());target2 = RDK。项目(“目标b3”, RDK.ITEM_TYPE_TARGET);流('选定目标2:\t%s\n'target2.Name ());%返回
机器人选择:ABB IRB 1600-8/1.45机器人参考选择:ABB IRB 1600-8/1.45基础对象选择:基础球选择:球1表选择:表1工具选择:工具目标1选择:目标b1目标2选择:目标b3

如何生成机器人程序

清除此脚本自动生成的先前项如果要删除任何项,则使用关键字"macro"再次执行% script。抽搐()1项= RDK。项目(“宏”);如果item.Valid() == 0迭代,直到没有名为“宏”的项打破结束%如果Valid()返回1,则表示找到了一个项目%如果是,则删除RoboDK站中的项目item.Delete ();结束%设置主关节Jhome = [0,0,0,0,0,30, 0];将机器人设置在起始位置robot.setJoints (jhome);%关闭渲染(更快)RDK.Render (0);得到工具姿势http = tool.PoseTool();创建一个关于机器人基准参考的参考系ref = RDK。AddFrame (“帧宏”, frameref);设置坐标系XYZ,绕Y旋转90度,再绕Z旋转180度Hframe = transl(750,250,500) * roty(pi / 2) * rotz(pi);ref.setPose (Hframe);将机器人的参考系设置为我们刚刚创建的参考系robot.setPoseFrame (ref);%设置工具框robot.setPoseTool (Htcp);%获取TCP在机器人基座上的位置Hhome = inv(Hframe) * robot.SolveFK(jhome) * http;创建一个新程序"prog"prog = RDK。AddProgram (“掠夺宏”);%创建一个联合目标主页target = RDK。AddTarget (“回家”, ref, robot);target.setAsJointTarget ();target.setJoints (jhome)在程序中加入关节运动prog.MoveJ(目标);%生成目标序列并沿着目标移动(线性移动)angleY = 0;Dy = 600:-100:100 targetname = sprintf“目标TY=%i RY=%i”;;;;;target = RDK。AddTarget (targetname, ref, robot);沿着参考系的Z方向移动姿态= transl(0, dy, 0);%保持与主方向相同的方向pose(1:3, 1:3) = home(1:3, 1:3);pose = pose * roty(angleY * pi / 180);target.setPose(构成);prog.MoveL(目标);angleY = angleY + 20;结束%设置每次呼叫自动渲染RDK.Render (1);运行我们刚刚创建的程序prog.RunProgram ();%等待移动完成robot.Busy()暂停(1);流(“等待机器人完成……\n”);结束再次运行程序流(“再次运行程序…\n”);prog.RunProgram ();
等待机器人完成…再次运行程序…

如何更改项所附加的父项

%修改目标器的支持度%对target1和target2进行操作的最终结果是相同的Htarget = target1.Pose();target1.setParentStatic (frameref);target1.setPose (Htarget);target2.setParent (frameref);我们可以列出依赖于一个项目的项目。children = frametable. children ();i = 1:numel(children) name = children {i}.Name();Newname = [name,“修改”];visible = children {i}.Visible();我孩子的{}.setName(新名称);流(“我% s % \ n”, newname,可见);结束
方法修改1目标b2修改1目标b4修改1目标b5修改1基修改1球1修改1球2修改1球3修改1

如何将对象附加/分离到机器人工具上

将最近的对象附加到工具上attached = tool. attachclose ();如果我们知道要附加什么对象,就可以使用这个函数%代替:object.setParentStatic(tool);如果attachedname = attachedname ();流(“附加:% s \ n”, attachedname);其他的%公差可更改为:% Tools->Options->General选项卡->附加对象的最大距离%机器人工具(默认为1000mm)流(“没有物体足够接近\n”);结束暂停(2);tool.DetachAll ();流(“分离所有对象\n”);
没有物体离得足够近

如何缩放对象以及如何检测碰撞

%替换对象(我们调用例1中先前设置的程序)RDK。项目(“替换对象”RDK.ITEM_TYPE_PROGRAM) .RunProgram ();验证从j1到j2的关节运动是否没有碰撞。%J1 = [-100, -50, -50, -50, -50, -50];J2 = [100,50,50,50,50,50,50];碰撞=机器人。MoveJ_Test(j1, j2, 1);disp(碰撞)激活跟踪以查看机器人试图走的路径激活跟踪:Tools-> trace ->Active (ALT+T)%检测碰撞:返回处于碰撞状态的对象对的数量pairs = RDK.Collisions();流(“对碰撞:%i\n”、双);缩放对象的几何形状,缩放可以是一个数字,也可以是每个轴的一个比例对象。Scale([10,10,0.5]);检测一条线和任何物体之间的交点P1 = [1000;0;8000);P2 = [1000;0;0);[collision, itempick, xyz] = RDK。Collision_Line (p1, p2);如果碰撞%或itemselected . valid ()流('从p1到p2的行与%s\n相撞'itempicked.Name ());在交叉点上创建一个点来显示碰撞ball.Copy ();newball = RDK.Paste();把这个球放在碰撞点newball.setPose(transl(xyz(1), xyz(2), xyz(3)));newball.Scale (0.5);把这个球按原来尺寸的50%做newball。Recolor([1 0 0]);把它做成一个红色的球结束
1对碰撞:从p1到p2的1条线与修改后的碱基碰撞

如何在不创建程序的情况下以编程方式移动机器人

%替换对象(我们调用例1中先前设置的程序)RDK。项目(“替换对象”RDK.ITEM_TYPE_PROGRAM) .RunProgram ();% RDK.setRunMode (1);%这将执行快速验证,而不显示动态移动% (1 = runmode_quickvalidate)流(“按目标物品移动……\n”);robot.setPoseFrame (frametable);RDK.setSimulationSpeed (10);I = 1:2机器人。setSpeed(10000、1000);robot.MoveJ (target1);机器人。setSpeed(100、200);robot.MoveL (target2);结束流(“通过关节移动……\n”);J1 = [0,0,0,0,0,0,0];J2 = [40, 30, -30, 0, 50, 0];i = 1:2 robot.MoveJ(J1);robot.MoveL (J2);结束流(“按姿势移动……\n”);按照以下步骤恢复一个姿势:双击一个机器人% 2-复制工具框架相对于用户框架的姿态(作为矩阵)粘贴到这里H1 = [-0.492404, -0.642788, -0.586824, -101.791308;-0.413176, 0.766044, -0.492404, 1265.638417;0.766044, 0.000000, -0.642788, 117.851733;0.000000, 0.000000, 0.000000, 1.000000];H2 = [-0.759717, -0.280123, -0.586823, -323.957442;0.060192, 0.868282, -0.492405, 358.739694;0.647462, -0.409410, -0.642787, 239.313006;0.000000, 0.000000, 0.000000, 1.000000];i = 1:2 robot.MoveJ(H1);robot.MoveL (H2);结束
按目标项目移动…通过关节运动…通过姿势移动……

计算机器人的正运动学和逆运动学

%获取当前机器人关节流(“当前机器人关节:\n”);joint = robot. joint ();disp(关节);获取TCP相对于参考帧的当前位置流('计算当前关节的姿态:\n');H_tcp_wrt_frame = robot.SolveFK(关节);disp (H_tcp_wrt_frame);%计算到达此位置的关节数(应与关节相同)流(“从姿态计算机器人关节:\n”);joints2 = robot.SolveIK(H_tcp_wrt_frame);disp (joints2);%计算所有解流('所选位置的所有解决方案:\n');joints3_all = robot.SolveIK_All(H_tcp_wrt_frame);disp (joints3_all);%在RoboDK的滑块中显示序列RDK.ShowSequence (joints3_all);暂停(1);使接头4的解决方案达到目标偏离100毫米的ZJoints4 =机器人。SolveIK(H_tcp_wrt_frame * transl(0,0, -100));将机器人置于计算出的新位置robot.setJoints (joints4);
当前机器人关节:-56.8091 -22.9201 33.5814 47.6220 54.6902 -104.7797当前关节的计算位姿:-0.5868 -0.2801 0.7597 305.0477 -0.4924 0.8683 -0.0602 -394.7465 -0.6428 -0.4094 -0.6475 978.1476 000 1.0000从位姿计算机器人关节:-56.8091 -22.9201 33.5814 47.6220 54.6902 -104.7797所有可用于选定位置的解:第1至第7列-56.8091 -56.8091 123.1909 123.1909 -56.8091 -56.8091 123.1909 -22.9201 -22.9201 -3.2918 -3.2918 -22.9201 -22.9201 -3.2918 33.5814 33.5814 -192.6814 -192.6814 33.5814 33.5814 -132.3780 -129.3428 50.6572 47.6220 -132.3780 -129.3428 54.6902 -54.6902 51.2124 -51.2124 54.6902 -54.6902 54.6902 51.2124 54.6902 54.6902 54.6902 75.2203 -284.7797 250.1869 10.0000 10.0000 10.0000 10.0000 10.0000 10.0000 10.0000 10.0000 0000 180.0000 226.2628 226.2628 360.0000 180.0000 354.9666第8列123.1909 -3.2918 -192.6814 50.6572 -51.2124 -289.8131 0 226.2628

示例添加目标到一个程序,并使用圆周运动

RDK = Robolink();机器人= RDK。项目(, RDK.ITEM_TYPE_ROBOT);%获取当前机器人姿势:pose0 = robot.Pose();%添加一个新程序:prog = RDK。AddProgram (“TestProgram”);创建一个到当前机器人位置的线性移动(MoveC由3定义)%点)target0 = RDK。AddTarget (“第一点”);target0.setAsCartesianTarget ();%默认行为target0.setPose (pose0);prog.MoveL (target0);%计算圆周移动:pos1 = pos0 * transl(50,0,0);pos2 = pos0 * transl(50,50,0);为循环移动添加第一个目标target1 = RDK。AddTarget (“第二点”);target1.setAsCartesianTarget ();target1.setPose (pose1);为循环移动添加第二个目标target2 = RDK。AddTarget (“第三点”);target2.setAsCartesianTarget ();target2.setPose (pose2);%增加循环移动指令:掠夺。MoveC (target1 target2)

铁路测试:

%启动APIRDK = Robolink();%取回机器人机器人= RDK。项目(, RDK.ITEM_TYPE_ROBOT);确保机器人是机械臂,而不是外部轴(返回a%指针指向自身,如果它已经是机器人)robot = robot. getlink (RDK.ITEM_TYPE_ROBOT);disp (robot.Name ());robot.setJointLimits ([-180;-180;-180;-180;-180;-180;0], [+ 180;+ 180; +180; +180; +180; +180; 5000]); [lower_limit, upper_limit] = robot.JointLimits(); disp(lower_limit) disp(upper_limit) joints = robot.JointsHome(); config = robot.JointsConfig(joints); disp(config) all_solutions = robot.SolveIK_All(robot.SolveFK(robot.Joints())); disp(all_solutions)
ABB IRB 1600-8/1.45 -180 -180 -180 -180 -180 -180 180 -180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 0000列1到7 -64.9691 -64.9691 -64.9691 - 64.0309 - 115.0309 - 115.0309 -27.6557 -27.6557 76.9661 76.9661 -89.0434 -89.0434 1.3654 29.7138 29.7138 29.7138 150.2862 11.0876 11.0876 168.9124 46.2971 -133.7029 103.8452 -76.1548 -109.3352 70.6648 -130.9223 66.4849 -66.4849 135.3704 -135.3704 61.3200 -103.9353 76.0647 27.3638 -152.6362 -17.5214 162.4786 -110.2446 10.0000 10.000010.0000 10.0000 10.0000 10.0000 0.0000 0.0000 180.0000 131.2992 203.4274 180.0000 266.4139 180.0000列8 115.0309 1.3654 168.9124 49.0777 -61.3200 69.7554 10.0000 180.0000

隐私
好吧我们的网站存储cookies,如我们的Cookie声明
通过使用我们的网站,您接受使用cookie。