加速机器人算法与代码生成

您可以为select Robotics System Toolbox™算法生成代码来加速它们的执行。将支持代码生成的算法设置为一个单独的函数,您可以将其万博1manbetx插入到您的工作流中。要使用代码生成,您必须有一个MATLAB®编码器™许可证。有关“机器人系统工具箱”中的代码生成支持列表,请参阅万博1manbetx支持代码生成的函数万博1manbetx

对于本例,使用ainverseKinematics对象与一个rigidBodyTree机器人模型,以解决机器人配置,实现所需的末端执行器位置。

为算法创建单独的函数

创建一个单独的函数,vfhCodeGen,运行逆运动学算法。创建inverseKinematics对象和构建rigidBodyTree函数内部的模型。指定% # codegen将其标识为用于代码生成的函数。

函数qConfig = ikCodegen (endEffectorName tform,重量、initialGuess)% # codegen机器人= rigidBodyTree (“MaxNumBodies”3,“DataFormat”,“行”);body1 = rigidBody (“界面”);界面。联合= rigidBodyJoint (“jnt1”,“转动”);body2 = rigidBody (“body2”);jnt2 = rigidBodyJoint (“jnt2”,“转动”);setFixedTransform(jnt2,trvec2tform([1 0 0])) body2。联合= jnt2;body3 = rigidBody (“工具”);jnt3 = rigidBodyJoint (“jnt3”,“转动”);2 . setFixedTransform(jnt3,trvec2tform([1 0 0]))联合= jnt3;addBody(机器人,界面,“基地”)addBody (body2的机器人“界面”)addBody (body3的机器人“body2”反向运动学(“RigidBodyTree”,机器人);本土知识[qConfig ~] = (endEffectorName tform,重量、initialGuess);结束

将函数保存在当前文件夹中。

执行算法的代码生成

你可以用任何一个codegen函数或MATLAB编码器应用程序生成代码。在本例中,通过调用来生成一个MEX文件codegen在MATLAB命令行。方法为函数的每个输入指定示例输入参数arg游戏输入参数

为输入参数指定样本值。

endEffectorName =“工具”;tform = trvec2tform([0.7 -0.7 0]);权重= [0.25 0.25 0.25 1 1 1];initialGuess = [0 0 0];

调用codegen函数并指定单元格数组中的输入参数。这个函数创建一个单独的vfhCodeGen_mex函数使用。方法生成C代码选项输入参数。

codegenikCodegenarg游戏{endEffectorName tform,重量,initialGuess}

如果您的输入可以来自可变大小的长度,请使用以下命令指定输入的规范类型coder.typeofcodegen函数。

检查生成代码的性能

使用以下命令将生成的MEX函数的计时与原始函数的计时进行比较时间

time = timeit(@() ikCodegen(endEffectorName,tform,weights,initialGuess)) mex = timeit(@() ikCodegen_mex(endEffectorName,tform,weights,initialGuess)
时间= 0.0425 mexTime = 0.0011

在本例中,MEX函数的运行速度要快30倍以上。结果可能在您的系统中有所不同。

将算法函数替换为MEX函数

打开运行您的机器人工作流程的主要功能。取代本土知识使用使用代码生成创建的MEX函数调用对象。对于本例,使用简单的2d路径跟踪示例。

打开具有逆运动学的二维路径跟踪的例子。

openExample (“机器人/ TwoDInverseKinematicsExampleExample”)

修改示例代码以使用新的ikCodeGen_mex函数。下面的代码是示例的一个副本,其中对使用新的MEX函数进行了修改。定义机器人模型是在函数内部完成的,因此跳过构建机器人部分。

定义轨迹

t = (0:0.2:10)”;%的时间数=长度(t);中心= [0.3 0.1 0];半径= 0.15;θ= t *(2 *π/ t(结束));点=中心+半径*[cos(theta) sin(theta) 0 (size(theta))];

逆运动学解

预先分配配置解决方案作为一个矩阵,万博 尤文图斯qs。指定末端执行器变换的权值和末端执行器的名称。

q0 = [0 0 0];ndof =长度(q0);qs = 0 (count, ndof);权值= [0,0,0,1,1,0];endEffector =“工具”;

循环通过点的轨迹来跟踪圆。取代本土知识对象调用ikCodegen_mex函数。计算每个点的解来生成实现末端执行器位置的关节构型。存储配置以供以后使用。

qInitial = q0处;%使用主配置作为初始猜测i = 1:计数解决满足所要求的末端执行器的配置问题%的位置点=点(我:);qSol = ikCodegen_mex (endEffector trvec2tform(点)、重量、qInitial);%存储配置qs(我:)= qSol;%从先前的解决方案开始qInitial = qSol;结束

动画解决方案

现在所有的解决方案都已经生成了。万博 尤文图斯有生命的结果。您必须重新创建机器人,因为它最初是在函数内部定义的。遍历所有解决方案。万博 尤文图斯

机器人= rigidBodyTree (MaxNumBodies, 15日“DataFormat”,“行”);body1 = rigidBody(界面);界面。联合= rigidBodyJoint (“jnt1”、“转动”);body2 = rigidBody (“body2”);jnt2 = rigidBodyJoint (“jnt2”、“转动”);setFixedTransform(jnt2,trvec2tform([0.3 0 0]))联合= jnt2;body3 = rigidBody(“工具”);jnt3 = rigidBodyJoint (“jnt3”、“转动”);2 . setFixedTransform(jnt3,trvec2tform([0.3 0 0]))联合= jnt3; addBody(robot,body1,'base') addBody(robot,body2,'body1') addBody(robot,body3,'body2') % Show first solution and set view. figure show(robot,qs(1,:)); view(2) ax = gca; ax.Projection = 'orthographic'; hold on plot(points(:,1),points(:,2),'k') axis([-0.1 0.7 -0.3 0.5]) % Iterate through the solutions framesPerSecond = 15; r = rateControl(framesPerSecond); for i = 1:count show(robot,qs(i,:),'PreservePlot',false); drawnow waitfor(r); end

这个例子向您展示了如何为特定的算法或函数生成代码来提高它们的速度,并简单地用工作流中生成的MEX函数替换它们。

另请参阅

||

相关的话题