主要内容

通过代码生成加速机器人算法

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

对于本例,使用onderedkinematics.对象与一个rigidBodyTree机器人模型来解决实现所需的末端效应位置的机器人配置。

为算法创建单独的函数

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

函数qconfig = ikcodegen(endeffectorname,tform,权重,initialguess)%#codegen.机器人= rigidBodyTree (“MaxNumBodies”3,“DataFormat”'排');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 = inverse运动学('刚性小组特雷',机器人);[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函数使用。类也可以生成C代码选项输入参数。

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函数

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

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

openExample ('机器人/ TwodInversekkinematicSexampleexample'

修改示例代码以使用newikCodegen_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);q = 0 (count, ndof);Weights = [0, 0, 0, 1, 1, 0];endEffector =“工具”;

通过循环点的轨迹来追踪圆。更换本土知识对象调用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编码器)

相关的话题