主要内容

使用代码生成加速机器人算法

您可以为选择机器人系统工具箱™算法生成代码,以加快执行。设置支持代码生成的算法作为您可以插入工作流程的单独函万博1manbetx数。要使用代码生成,您必须拥有一个马铃薯®编码器™许可证。有关机器人系统工具箱中的代码生成支持列表,请参阅万博1manbetx支持代码生成的功能万博1manbetx

对于此示例,请使用aonderedkinematics.与A的对象刚性小组细胞机器人模型来解决实现所需的末端效应位置的机器人配置。

为算法创建单独的函数

创建一个单独的功能,IKCodegen.,运行逆运动学算法。创造onderedkinematics.对象并构建刚性小组细胞模型内部功能。指定%#codegen.在函数内部以将其标识为代码生成的函数。

功能qconfig = ikcodegen(endeffectorname,tform,权重,initialguess)%#codegen.robot =刚性小牛排('maxnumbodies',3,'datomformat''行');Body1 =刚体('body1');body1.joint = rigidbodejoint('JNT1''旋转');Body2 =刚体('body2');jnt2 = rigidbodejoint('jnt2''旋转');setfixedTransform(JNT2,TRVEC2TForm([1 0 0]))BODY2.joint = JNT2;body3 =刚体('工具');jnt3 = rididodejoint('JNT3''旋转');setfixedTransform(JNT3,TRVEC2TForm([1 0 0]))BODY3.joint = JNT3;加法人(机器人,Body1,'基地')加法人(机器人,Body2,'body1')加法人(机器人,Body3,'body2')IK = underedkinematics('刚性小组特雷',机器人);[qconfig,〜] = ik(endeffectorname,tform,权重,initialguess);结束

保存当前文件夹中的函数。

执行算法的代码生成

你可以使用Codegen.(MATLAB编码器)功能或者Matlab编码器(MATLAB编码器)应用程序生成代码。在此示例中,通过调用来生成MEX文件Codegen.在matlab命令行上。使用使用的功能为每个输入指定示例输入参数- args.输入参数

指定输入参数的示例值。

endeffectorname ='工具';tform = trvec2tform([0.7-0.7 0]);重量= [0.25 0.25 0.25 1 1];initialGuess = [0 0 0];

打电话给Codegen.函数并在单元格数组中指定输入参数。此功能创建一个单独的ikcodegen_mex.使用功能。您也可以使用该代码使用选择输入参数。

Codegen.IKCodegen.-  args.{EndeffectorName,Tform,权重,InitialGuess}

如果您的输入可以来自变量大小的长度,请使用以下方式指定CONONICE类型的输入类型Coder.typeof.(定点设计师)与之Codegen.(MATLAB编码器)功能。

检查生成代码的性能

将生成的MEX功能的定时与原始功能的定时进行比较时代

time = timeit(@()ikcodegen(endeffectorname,tform,权重,initialguess))mextime = timeit(@()ikcodegen_mex(endeffectorname,turb,权重,initialguess)
时间= 0.0425 mextime = 0.0011

MEX函数在此示例中运行超过30倍。结果可能会有所不同。

用MEX函数替换算法功能

打开运行机器人工作流程的主要功能。更换IK.对象调用您使用代码生成创建的MEX函数。对于此示例,请使用简单的2-D路径跟踪示例。

打开与逆运动学的2-D路径跟踪示例。

OpenExample('机器人/ TwodInversekkinematicSexampleexample'

修改示例代码以使用新的ikcodegen_mex.功能。遵循的代码是示例的副本,该副本具有对使用新MEX函数的修改。定义机器人模型是在功能内完成的,所以跳过构建机器人部分。

定义轨迹

t =(0:0.2:10)';%时间count =长度(t);中心= [0.3 0.1 0];半径= 0.15;theta = t *(2 * pi / t(端));点=中心+半径* [cos(θ)sin(θ)zeros(尺寸(θ)];

逆运动学解决方案

预先分配配置解决方案作为矩阵,万博 尤文图斯QS.。指定末端执行器转换和终端执行器名称的权重。

Q0 = [0 0 0];ndof =长度(q0);QS =零(计数,NDOF);权重= [0,0,0,1,1,0];Endeffector ='工具';

循环通过点的轨迹来跟踪圆圈。更换IK.对象调用ikcodegen_mex.功能。计算每个点的解决方案以产生实现终端效应器位置的联合配置。存储稍后使用的配置。

Qinitial = Q0;%使用家庭配置作为初始猜测对于我= 1:计数对于满足所需末端执行器的配置来解决%%地位点=点(i,:);qsol = ikcodegen_mex(endeffector,trvec2tform(point),权重,qinitial);%存储配置qs(i,:) = qsol;%从先前解决方案开始Qinitial = QSOL;结束

动画解决方案

现在已经生成了所有解决方案。万博 尤文图斯为结果设置动画。您必须重新创建机器人,因为它最初在函数内定义。通过所有解决方案迭代。万博 尤文图斯

robot =刚性小组特('maxnumbodies',15,'dataformat','行');body1 =刚体('body1');body1.joint = rigidodejoint('jnt1','旋转');body2 =刚体('body2');jnt2 = rigidbodejoint('jnt2','旋转');setfixedTransform(JNT2,TRVEC2TFORM([0.3 0 0]))BODY2.joint = JNT2;body3 =刚体('工具');jnt3 = rigidbodejoint('jnt3','旋转');setfixedTransform(JNT3,TRVEC2TFORM([0.3 0 0]))BODY3.joint = JNT3;加法人(机器人,Body1,'基础')加法人(机器人,Body2,'Body1')加法人(机器人,BODD3,'BODD2')%显示了第一个解决方案和设置视图。 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函数替换。

另请参阅

||(MATLAB编码器)

相关主题