您可以为select Robotics System Toolbox™算法生成代码,以加速它们的执行。将支持代码生成的算法设置为可插入工作流的单独函数。金宝app要使用代码生成,您必须有MATLAB®编码器™许可证。有关Robotics System Toolbox中的代码生金宝app成支持列表,请参见支持代码生成的功能金宝app.
对于此示例,请使用ainverseKinematics
与A的对象刚性小组细胞
机器人模型,求解机器人构型,以达到期望的末端执行器位置。
创建一个单独的函数,ikCodegen
,运行逆运动学算法。创建inverseKinematics
对象,并构建刚性小组细胞
函数内部的模型。指定% # codegen
在函数内部以将其标识为代码生成的函数。
功能qConfig = ikCodegen (endEffectorName tform,重量、initialGuess)% # codegenrobot =刚性小牛排('maxnumbodies',3,'datomformat',“行”);body1 = rigidBody (“界面”);界面。联合= rigidBodyJoint ('JNT1','旋转');body2 = rigidBody (“body2”);jnt2 = rigidBodyJoint (“jnt2”,'旋转');setFixedTransform(jnt2,trvec2tform([1 0 0]))联合= jnt2;body3 = rigidBody (“工具”);jnt3 = rigidBodyJoint (“jnt3”,'旋转');setFixedTransform(jnt3,trvec2tform([1 0 0]))联合= jnt3;addBody(机器人,界面,'根据') addBody (body2的机器人“界面”) addBody (body3的机器人“body2”)IK = underedkinematics(“RigidBodyTree”,机器人);本土知识[qConfig ~] = (endEffectorName tform,重量、initialGuess);结束
保存当前文件夹中的函数。
你可以用codegen
(MATLAB编码器)功能或者MATLAB编码器(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
函数并在单元格数组中指定输入参数。此功能创建一个单独的ikcodegen_mex.
使用功能。您也可以使用该代码使用选项
输入参数。
codegenikCodegenarg游戏{EndeffectorName,Tform,权重,InitialGuess}
如果您的输入可以来自可变大小的长度,请使用Coder.typeof.
(定点设计师)与之codegen
(MATLAB编码器)函数。
将生成的MEX功能的定时与原始功能的定时进行比较时代
.
time = timeit(@() ikCodegen(endEffectorName,tform,weights,initialGuess)) mexTime = timeit(@() ikCodegen_mex(endEffectorName,tform,weights,initialGuess))
时间= 0.0425 mexTime = 0.0011
MEX函数在此示例中运行超过30倍。结果可能会有所不同。
打开main函数来运行你的机器人工作流。取代我知道
对象调用您使用代码生成创建的MEX函数。对于此示例,请使用简单的2-D路径跟踪示例。
打开2-D逆运动学路径跟踪例子。
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) zeros(size(theta))];
逆运动学解决方案
预先分配配置解决方案作为矩阵,金宝搏官方网站qs
.指定末端执行器转换和终端执行器名称的权重。
Q0 = [0 0 0];ndof =长度(q0);QS =零(计数,NDOF);权重= [0,0,0,1,1,0];Endeffector ='工具';
循环通过点的轨迹来跟踪圆圈。取代我知道
对象调用ikcodegen_mex.
函数。计算每个点的解决方案以产生实现终端效应器位置的联合配置。存储稍后使用的配置。
qInitial = q0处;%使用home配置作为初始猜测为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”、“转动”);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函数替换。
codegen
(MATLAB编码器)|时代
|inverseKinematics