RoboDK API for Matlab

内容

这是一个使用RoboDK API的Matlab示例。这是一个。m文件(Matlab文件)。用于Matlab的RoboDK API需要此文件夹中的文件。这个例子需要RoboDK正在运行%(否则,如果RoboDK安装在默认位置,则会启动)这个例子会自动加载默认安装在“Library”文件夹中的example 01注:本程序并不是为了完成某个特定的目标,只是为了展示如何使用Matlab API% RoboDK api帮助:% ->输入"doc Robolink"以获得有关Robolink类的更多帮助% ->输入"doc RobolinkItem"以获得关于RobolinkItem项目类的更多帮助% ->输入“showdemo Example_RoboDK”,例如如何使用RoboDK的API,使用最后两个类中图分类clear close所有生成一个Robolink对象RDK。该对象与RoboDK接口。RDK = Robolink;获取库路径path = RDK.getParam(“PATH_LIBRARY”);打开示例1RDK。AddFile([路径,“Tutorial-UR-Painting.rdk”]);显示所有项的列表流(“车站内可用物品:\n”);disp (RDK.ItemList ());按名字取一件物品program = RDK。项目(“MainProg”);开始模拟“MainProg”程序(不阻塞调用)program.RunProgram ();%可选:等待程序完成:program.Busy()流(“工作…\ n”)暂停(0.5)结束流(“做!\ n”运行程序的可选调用% program = RDK.Item('MainProg').RunProgram();运行相同程序的另一种方法% RDK.RunProgram(“MainProg”);%返回;
在车站可用的项目:列1至5“油漆测试”“UR10基础”“UR10”“油漆枪”“框架2”列6至9“对象检查”“家”“方法”“顶级油漆1”列10至13“顶级油漆2”“顶级油漆3”“顶级油漆4”“顶级油漆5”列14至17“顶级油漆6”“顶级油漆7”“顶级油漆8”“撤回”列18至22“ApproachMove”“油漆顶部”“撤回”“MainProg”“喷漆”工作…工作……工作……工作……工作……工作……工作……工作……工作……工作…… Working... Working... Working... Working... Working... Working... Working... Done!

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

在站点中按名称获取一些物品。。每个项目都可见%当前项目树机器人= RDK。项目(“UR10”);流(“选定机器人:%s\n”robot.Name ());robot.setVisible (1);使用PoseAbs检索项目相对于站点的位置()% robot.PoseAbs ()ref_base = robot.Parent();流('机器人底座:%s\n'ref_base.Name ());object = RDK。项目(“对象检查”);流(所选对象:%s\nobject.Name ());ref_object = RDK。项目(“第二帧”);流(参考框架:%s\nref_object.Name ());tool = RDK。项目(喷漆枪的);流('已选择工具:t%s\n'tool.Name ());target1 = RDK。项目(“回家”);流(目标1已选:\t%s\ntarget1.Name ());target2 = RDK。项目(“方法”);流(目标2已选:\t%s\ntarget2.Name ());%返回
Robot selected: UR10 Robot base frame: UR10 base Object selected: Object Inspection Reference frame: frame 2 Tool selected: tPaint gun Target 1 selected: Home Target 2 selected: Approach

如何从Matlab代码直接移动机器人

获取第一个目标(主目标)的联合值:% jhome = [0,0,0,0,30,0];jhome = target1. joint ();设置模拟速度。这是一个比率,例如,模拟速度% of 5(默认)表示模拟时间的1秒对应于1%实时时间。RDK.setSimulationSpeed (5);%可选地,更改运行模式并生成程序(忽略模拟到%生成机器人程序)。这将生成一个SCRIPT和URP文件万能机器人机器人。% RDK.setRunMode (RDK.RUNMODE_MAKE_ROBOTPROG)% RDK.ProgramStart(“MatlabProgram”);将机器人设置在home位置robot.setJoints (jhome);%立即移动robot.MoveJ (jhome);%联合移动确保我们正在使用所选的工具和参考框架%的机器人robot.setPoseTool(工具);%设置工具框架(作为项目或姿态)robot.setPoseFrame (ref_object);设置参考框架(作为项目或姿势)robot.setSpeed (100);%设置TCP线速度,单位为mm/s检索所有的参考系依赖项(附加到它的项)ref_object_items = ref_object.Childs();I = 1: number (ref_object_items) item_i = ref_object_items{I};如果item_i.Type() ~= Robolink. .ITEM_TYPE_TARGET流(“跳过:% s \ n”item_i.Name ());继续结束流(“移动到:%s…\n”item_i.Name ());robot.MoveJ (item_i)或者,我们可以给机器人一个4x4的姿势:% robot.MoveL (item_i.Pose ())%或者,给定关节值,我们也可以移动机器人:% robot.MoveJ (item_i.Joints ())结束流(“做!\ n”);表示生成程序的结束(当使用程序生成时)RDK.Finish ()
跳过:对象检查移动到:家…转向:接近……移动到:顶部油漆1…移动到:顶部油漆2…移动到:顶部油漆3…移动到:顶部油漆4…移动到:顶部油漆5…移动到:顶部油漆6…移动到:顶部油漆7…移动到:顶部油漆8… Moving to: Retract ... Done!

如何创建程序

清除之前使用该脚本自动生成的项目,如果我们希望在再次执行脚本时删除任何项目,则使用关键字“宏”。

抽搐()1项= RDK。项目(“宏”);如果item.Valid() == 0迭代,直到没有带有“宏”名称的项打破结束如果Valid()返回1,则表示找到了一个项%在这种情况下,删除RoboDK站的项目item.Delete ();结束%关闭渲染(更快)RDK.Render (0);获得工具姿势Htcp = tool.PoseTool();创建一个关于机器人基础参考的参考系ref = RDK。AddFrame (“帧宏”, ref_base);设置坐标系XYZ,绕Y旋转90度,绕Z旋转180度Hframe = transl(0,-500,200)*rotz(pi/2);ref.setPose (Hframe);将机器人的参考系设置为我们刚刚创建的参考系robot.setPoseFrame (ref);%设置机器人工具架(按项目或姿势)robot.setPoseTool(工具);% robot.setPoseTool (Htcp);关节1增加90度以设置一个新的home目标Jhome2 = jhome;Jhome2 (1) = jhome(1) + 90;robot.setJoints (jhome2)获得TCP相对于home机器人基地的位置%的位置Hhome2 = inv(Hframe)*robot.SolveFK(jhome2)*Htcp;这和robot. pose()是一样的,因为我们只是把机器人移动到那里:% Hhome = robot.Pose()创建一个联合目标hometarget = RDK。AddTarget (家2》, ref, robot);target.setPose (Hhome2);target.setJoints (jhome2);target.setAsJointTarget ();创建一个新程序"Prog"prog = RDK。AddProgram (“掠夺宏”);指定活动参考框和工具框prog.setPoseFrame (ref) prog.setPoseTool(工具)将关节运动添加到程序中prog.addMoveJ(目标);生成一个目标序列,并沿着目标移动(线性移动)angleY = 0;Dx =-400:100:400 targetname = sprintf('目标TX=%i RY=%i'dx, angleY);target = RDK.AddTarget(targetname,ref,robot);%相对于参考系沿X方向移动(预乘)%,并相对于工具方向旋转(后乘)姿态= transl(dx,0,-100)*Hhome2*roty(angleY*pi/180);target.setPose(构成);prog.addMoveL(目标);angleY = angleY + 5;结束设置每次修改后自动渲染RDK.Render (1);运行我们刚刚创建的程序prog.RunProgram ();等待移动完成robot.Busy()暂停(0.5);流(“等待机器人完成……\n”);结束再次运行程序% fprintf('再次运行程序…\n');% prog.RunProgram ();
等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…

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

得到机器人关节流('当前机器人关节:\n');关节= robot.关节();disp(关节);得到机器人法兰相对于机器人底座的位置流(当前关节的计算姿态:\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);计算一个新的解决方案,以达到目标偏离100毫米在Z沿机器人法兰joints4 = robot.SolveIK(H_tcp_wrt_frame*transl(0,0,-100));将机器人设置在计算的新位置robot.setJoints (joints4);
当前机器人关节:-58.2186 -74.4992 -80.3729 -111.8020 89.0605 119.7580当前关节计算位姿:-0.0343 0.9993 0.0166 109.3584 0.9977 0.0353 -0.0579 -490.5706 -0.0585 0.0146 -0.9982 865.8185 000 1.0000从位姿计算机器人关节:-58.2186 -74.4992 -80.3729 -111.8020 89.0605 119.7580所选位置可用的所有解:第1至7列-58.2186 83.2759 83.2759 -58.2186 83.2759 -58.2186 -74.4992 -26.7665 -105.4910 - 84.4943 -80.3729 - 59.4461 -59.4481 -59.4052 -80.3355 -59.4052 -111.8020 173.0263 -68.0327 111.3080 68.7977 15.6586 7.1242 89.0605 88.6658 -88.6658 88.6658 -89.0605 -88.6658 -89.0605 119.7580 -98.6831 81.3169 -98.6831 -60.2420 83.2759 83.2759 -151.5140 -26.7665 -83.9443-96.0666 -151.5140 - 26.4465 -83.9443 80.3729 -59.4481 -59.4481 -59.4481 164.4670 -186.9737 -248.6920 -291.2023 -195.5330 173.0263 111.3080 -98.6831 -98.6831 - 619.7520 119.7580 - 98.2186 - 98.2186 83.2759 83.2759 -58.2186 -96.0666 -153.2036 -26.7665 -83.9443 -59.4052 -59.4481 - 59.4081 - 68.7977 7.1242 -186.9737 -248.6920 -291.2023 -89.060588.6658 88.6658 -89.0605 299.7580 299.7580 261.3169 261.3169 299.7580

如何缩放一个物体,如何检测碰撞

验证关节从j1到j2的移动是否没有碰撞碰撞=机器人。MoveJ_Test(jhome, jhome2, 1);disp(碰撞)激活跟踪以查看机器人试图走哪条路径。激活trace: Tools-> trace ->Active (ALT+T)%检测碰撞:返回处于碰撞状态的对象对的数量提示:在:Tools-Collision map中设置碰撞贴图pairs = RDK.Collisions();流(碰撞状态下的对象对:%i\n、双);缩放对象的几何形状,缩放可以是一个数字,也可以是每个轴的一个比例%的对象。Scale([10,10,0.5]);检测一条线与任何物体的交点P1 = [-1000;300;5000);P2 = [-1000;300;-5000);[碰撞,itemselected, xyz] = RDK。Collision_Line (p1, p2);如果itempicked.Valid()流(从p1到p2的直线与%s\n碰撞itempicked.Name ());在交叉点上创建一个点来显示碰撞new_ref = RDK。AddFrame (“碰撞”);将球设置在碰撞点xyz new_ref.setPose (transl (xyz (1), (2), xyz (3)));% newball.Scale (0.5);把这个球做成原来尺寸的50%% newball。重新着色([1 0 0]);做一个红色的球结束
0处于碰撞状态的对象对:2 p1 ~ p2行与“对象检测”发生碰撞

如何附加/分离一个对象到机器人工具

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