RoboDK API for Matlab

内容

这是一个使用RoboDK API的Matlab示例。这个例子并不是要展示一个特定的应用程序,只是如何%与API交互这是一个。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 = "C:\RoboDK\Library";从RoboDK 5.5开始,PATH_LIBRARY指向文档path = RDK.getParam(“PATH_LIBRARY”);打开示例1% RDK。AddFile([path,'Example 01 - Pick and place.rdk']);%之前的RoboDK 4.0.0RDK。AddFile([路径,“Example-06。挑选并放置两张桌子。rdk']);显示所有项的列表流(“车站内可用物品:\n”);disp (RDK。ItemList (1,1));按名称获取一件物品program = RDK。项目(“挑选和放置”, RDK.ITEM_TYPE_PROGRAM);启动“挑选和放置”程序program.RunProgram ();运行程序的可选调用% program = RDK。项目(“挑选和放置”).RunProgram();%运行相同程序的另一个替代调用% RDK。运行程序('选择和放置');%返回;
站内可用项目:第1至3列{'示例1 - Pic…'}{'ABB IRB 1600-8/…'}{'ABB IRB 1600-8/…'}第4至8列{'工具'}{'表1'}{'方法'}{'目标b1'}{'目标b2'}第9至13列{'目标b3'}{'目标b4'}{'目标b5'} 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 ()frameref = 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\ntarget1.Name ());target2 = RDK。项目(“目标b3”, RDK.ITEM_TYPE_TARGET);流(目标2已选:\t%s\ntarget2.Name ());%返回
Robot selected: ABB IRB 1600-8/1.45 Robot reference selected: ABB IRB 1600-8/1.45 Base Object selected: Base Ball selected: Ball 1 Table selected: Table 1 Tool selected: Tool Target 1 selected: Target b1 Target 2 selected: Target b3

如何生成机器人程序

清除此脚本自动生成的先前项目%如果我们想删除任何项时,使用关键字“宏”% script再次执行。抽搐()1项= RDK。项目(“宏”);如果item.Valid() == 0迭代,直到没有带有“宏”名称的项打破结束如果Valid()返回1,则表示找到了一个项%如果是,在RoboDK站中删除该项item.Delete ();结束设置家庭关节Jhome = [0,0,0,0,30,0];将机器人设置在home位置robot.setJoints (jhome);%关闭渲染(更快)RDK.Render (0);获得工具姿势Htcp = 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) * Htcp;创建一个新程序"prog"prog = RDK。AddProgram (“掠夺宏”);创建一个联合目标hometarget = RDK。AddTarget (“回家”, ref, robot);target.setAsJointTarget ();target.setJoints (jhome)将关节运动添加到程序中prog.MoveJ(目标);生成一个目标序列,并沿着目标移动(线性移动)angleY = 0;Dy = 600:-100:100 target = sprintf('目标TY=%i RY=%i', dy, angleY);target = RDK。AddTarget (targetname, ref, robot);沿参考系的Z方向移动姿态= transl(0, dy, 0);保持与home朝向相同的方向。pose(1:3, 1:3) = Hhome(1:3, 1:3);姿态=姿态* 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);我们可以列出依赖于某项的项childs ();i = 1: number (children) name = children {i}.Name();Newname = [name,]“修改”];visible = children {i}.Visible();我孩子的{}.setName(新名称);流(“我% s % \ n”, newname, visible);结束
进近修正1目标b2修正1目标b4修正1目标b5修正1基地修正1球1球修正1球2球修正1球3球修正1

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

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

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

替换对象(我们调用之前在例1中设置的程序)RDK。项目(“替换对象”RDK.ITEM_TYPE_PROGRAM) .RunProgram ();验证关节从j1到j2的移动是否没有碰撞J1 = [-100, -50, -50, -50, -50, -50, -50];J2 = [100,50,50,50,50,50];碰撞=机器人。MoveJ_Test(j1, j2, 1);disp(碰撞)激活跟踪以查看机器人试图走哪条路径。激活trace: Tools-> trace ->Active (ALT+T)%检测碰撞:返回处于碰撞状态的对象对的数量pairs = RDK.Collisions();流('对碰撞:%i\n'、双);缩放对象的几何形状,缩放可以是一个数字,也可以是每个轴的一个比例对象。Scale([10,10,0.5]);检测一条线与任何物体的交点P1 = [1000;0;8000);P2 = [1000;0;0);[碰撞,itemselected, 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。重新着色([1 0 0]);做一个红色的球结束
1对碰撞:1从p1到p2的行与修改后的碱基发生碰撞

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

替换对象(我们调用之前在例1中设置的程序)RDK。项目(“替换对象”RDK.ITEM_TYPE_PROGRAM) .RunProgram ();% RDK.setRunMode (1);%这将执行快速验证,而不显示动态移动% (1 = runmode_quickvalidate)流(“按目标物品移动……\n”);robot.setPoseFrame (frametable);RDK.setSimulationSpeed (10);我= 1:2的机器人。setSpeed(10000、1000);robot.MoveJ (target1);机器人。setSpeed(100、200);robot.MoveL (target2);结束流(“用关节移动……\n”);J1 = [0,0,0,0,50,0];J2 = [40,30, - 30,0, 50,0];i = 1:2 robot.MoveJ(J1);robot.MoveL (J2);结束流(“按姿势移动……\n”);遵循以下步骤来恢复一个姿势:% 1-双击机器人% 2-复制工具帧相对于用户帧的姿态(作为矩阵)% 3-粘贴在这里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.775717, -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');关节= robot.关节();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毫米在Z关节=机器人。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 -22.9201 -3.2918 33.5814 33.5814 -192.6814 -192.6814 33.5814 33.5814 -192.6814 47.6220 -132.3780 -129.3428 50.6572 47.6220 -132.3780 -129.3428 54.6902 51.2124 -51.2124 54.6902 54.6902 51.2124 -104.7797 75.2203 -109.8131 70.1869 255.2203 -284.7797 250.1869 10.0000 10.0000 10.0000 10.0000 0000 0.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);%计算循环移动:Pose1 = pose0 * transl(50,0,0);Pose2 = pose0 * 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);确保机器人是机械臂,而不是外轴(返回一个%指针指向自身(如果它已经是机器人)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 0000列1至7 -64.9691 -64.9691 -64.9691 -64.9691 -64.9691 115.0309 115.0309 -27.6557 -27.6557 76.9661 76.9661 -89.0434 1.3654 29.7138 29.7138 150.2862 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 136.9424 -136.9424 135.3704 -135.3704 61.3200 -103.9353 76.0647 27.3638 -152.6362 -17.5214 162.4786 -110.2446 10.0000 10.0000 10.000010.0000 10.0000 10.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声明
通过使用我们的网站,您接受使用cookies。
Baidu
map