这是一个在Matlab中使用RoboDK 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;获取库路径路径= RDK.getParam (“PATH_LIBRARY”);%打开示例1RDK。AddFile([路径,“Tutorial-UR-Painting.rdk”]);显示所有项目的列表流('站内可用物品:\n');disp (RDK.ItemList ());通过名称获取一件物品程序= 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列“物体检查”“Home”“接近”“顶级涂料1”第10至13列“顶级涂料2”“顶级涂料3”“顶级涂料4”“顶级涂料5”第14至17列“顶级涂料6”“顶级涂料7”“顶级涂料8”“撤回”第18至22列“ApproachMove”“PaintTop”“撤回”“MainProg”“SprayOn”工作……工作……工作……工作……工作……工作……工作……工作……工作……工作…… 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 ());对象= RDK。项目(“对象检查”);流(“对象选择:% s \ n”object.Name ());ref_object = RDK。项目(“第二帧”);流(“参考系:% s \ n”ref_object.Name ());= RDK工具。项目(喷漆枪的);流(选择“工具:t % s \ n 'tool.Name ());target1 = RDK。项目(“回家”);流(“选择目标1:\ t % s \ n”target1.Name ());target2 = RDK。项目(“方法”);流(“选择目标2:\ t % s \ n”target2.Name ());%返回
机器人选择:UR10机器人基础框架:UR10基础对象:对象检查参考框架:框架2工具选择:tPaint gun目标1选择:Home目标2选择:Approach
获取第一个目标(home目标)的联合值:% jhome = [0,0,0, 0,30, 0];jhome = target1.Joints ();设置模拟速度。这是一个比率,例如,模拟速度% 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: numl (ref_object_items) item_i = ref_object_items{I};如果~ = Robolink item_i.Type()。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 ()
跳过:对象检查移动到:Home…移动到:接近……移动到:顶部油漆1…移动到:Top Paint 2…移动到:顶部油漆3…移动到:顶部油漆4…移动到:Top Paint 5…移动到:Top Paint 6…移动到:Top Paint 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 -500200) * rotz(π/ 2);ref.setPose (Hframe);将机器人的参考系设置为我们刚刚创建的参考系robot.setPoseFrame (ref);%设置机器人工具框(按物品或按姿势)robot.setPoseTool(工具);% robot.setPoseTool (Htcp);将关节1增加90度,设置一个新的家庭目标jhome2 = jhome;Jhome2 (1) = jhome(1) + 90;robot.setJoints (jhome2)获取TCP相对于机器人基地的位置%的位置Hhome2 =发票(Hframe) * robot.SolveFK (jhome2) * Htcp;这和robot. pose()是一样的,因为我们只是把机器人移动到那里:% Hhome = robot.Pose()创建一个联合目标主页。目标= RDK。AddTarget (家2》ref,机器人);target.setPose (Hhome2);target.setJoints (jhome2);target.setAsJointTarget ();创建一个新程序"Prog"学监= RDK。AddProgram (“掠夺宏”);指定活动参考框架和工具框架prog.setPoseFrame (ref) prog.setPoseTool(工具)将关节运动添加到程序中prog.addMoveJ(目标);生成一系列目标并沿着目标移动(线性移动)angleY = 0;为=-400:100:400 target = sprintf('目标TX = % = %我'我变化dx, angleY);目标= RDK.AddTarget (targetname,裁判,机器人);沿X方向相对于参考系移动(预乘)%并相对于工具方向旋转(相乘后)构成= transl (dx, 0, -100) * Hhome2 * roty (angleY *π/ 180);target.setPose(构成);prog.addMoveL(目标);angleY = angleY + 5;结束设置每次修改后自动渲染RDK.Render (1);运行我们刚刚创建的程序。prog.RunProgram ();等待移动完成而robot.Busy()暂停(0.5);流(“等待机器人完成…\n”);结束再次运行程序% fprintf('再次运行程序…\n');% prog.RunProgram ();
等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…等待机器人完成…
得到机器人关节流(“目前机器人关节:\ n”);关节= robot.Joints ();disp(关节);得到机器人法兰相对于机器人底座的位置流('当前关节的计算姿势:\n');H_tcp_wrt_frame = robot.SolveFK(关节);disp (H_tcp_wrt_frame);计算到达此位置的机器人关节。它返回闭包%匹配到当前机器人关节位置(应与%关节)流('从pose计算机器人关节:\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 -83.9443 - 96.0665 -28.5114 -153.2036 -80.3355 59.4481 -59.4052 -80.3355 - 59.4081 -80.3355 -59.4052 -111.8020 173.0263 -68.0327 111.3080 -80.3355 68.7958 - 59.6586 7.1242 89.0605 88.6658 -88.6658 88.6658 -89.0605 119.7580 -98.6831 81.3169 -98.6831 83.2759 -58.2186 -58.2186 83.2759 -151.5140 -26.7665 -83.9443-96.0666 -151.5140 -26.7665 -83.9443 80.3729 -59.4481 -59.4481 164.4670 -186.9737 -248.6920 -291.2023 -195.5330 173.0263 111.3080 89.0605 88.6658 -89.0605 89.0605 88.6658 88.6658 119.7580 -98.6831 -98.6831 - 60.2459 -58.2186 -96.0666 -153.2036 -26.7665 - 83.2759 -58.2186 - 59.4443 - 59.4077 7.1242 -186.9737 -248.6920 -291.2023 -89.0605 -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(碰撞)激活跟踪以查看机器人试图走哪条路径。%激活跟踪:Tools-> trace ->Active (ALT+T)%检测碰撞:返回处于碰撞状态的对象对的数量提示:将碰撞贴图设置为:工具-碰撞贴图对= RDK.Collisions ();流('处于碰撞状态的对象对:%i\n'、双);缩放物体的几何形状,缩放可以是一个数字或每个轴的一个缩放%的对象。规模([10 10 0.5]);检测一条线和任何物体之间的交点p1 = [-1000;300;5000);p2 = [-1000;300;-5000);[collision, 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线与Object Inspection发生碰撞
把最近的物体贴在工具上附加= tool.AttachClosest ();如果我们知道要附加什么对象,就可以使用这个函数%: object.setParentStatic(工具);如果attachedname = attached.Name();流(“附加:% s \ n”, attachedname);其他的%公差可以在:选项->通用选项卡->附加对象的最大距离%一个机器人工具(默认为1000毫米)流(“没有物体足够近\n”);结束暂停(2);tool.DetachAll ();流(“分离所有对象\ n”);
没有对象足够接近分离所有对象