用代码生成加速机器人算法
您可以为选择的Robotics System Toolbox™算法生成代码,以加快其执行速度。将支持代码生成的算法设置为可以插入到工作流中的单独函金宝app数。要使用代码生成,必须具有MATLAB®编码器™许可证。有关“机器人系统工具箱”中的代码生成支持的列表,请参见金宝app支持代码生成的函数金宝app.
对于本例,使用ainverseKinematics
对象的rigidBodyTree
机器人模型,以解决机器人配置,实现所需的末端执行器位置。
为算法创建单独的函数
创建一个单独的函数,ikCodegen
,运行逆运动学算法。创建inverseKinematics
对象,并构建rigidBodyTree
函数内部的模型。指定% # codegen
在函数内部将其标识为用于代码生成的函数。
函数qConfig = ikCodegen(endEffectorName,tform,weights,initialGuess)% # codegen机器人= rigidBodyTree(“MaxNumBodies”3,“DataFormat”,“行”);body1 = rigidBody(“界面”);界面。关节= rigidBodyJoint(“jnt1”,“转动”);body2 = rigidBody(“body2”);jnt2 = rigidBodyJoint(“jnt2”,“转动”);setFixedTransform(jnt2,trvec2tform([1 0 0]))Joint = jnt2;body3 = rigidBody(“工具”);jnt3 = rigidBodyJoint(“jnt3”,“转动”);setFixedTransform(jnt3,trvec2tform([1 0 0]))Joint = jnt3;addBody(机器人,界面,“基地”) addBody (body2的机器人“界面”) addBody (body3的机器人“body2”) ik =逆运动学(“RigidBodyTree”,机器人);[qConfig,~] = ik(enffectorname,tform,weights,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
函数要使用。方法也可以生成C代码选项
输入参数。
codegenikCodegenarg游戏{endEffectorName tform,重量,initialGuess}
如果您的输入可以来自可变大小的长度,请使用指定输入的规范类型coder.typeof
(定点设计师)与codegen
(MATLAB编码器)函数。
检查生成代码的性能
通过使用,将生成的MEX函数的计时与原始函数的计时进行比较时间
.
time = timeit(@() ikCodegen(endEffectorName,tform,weights,initialGuess)) mexTime = timeit(@() ikCodegen_mex(endEffectorName,tform,weights,initialGuess))
time = 0.0425 mexTime = 0.0011
本例中,MEX函数的运行速度提高了30倍以上。结果可能在您的系统中有所不同。
将算法函数替换为MEX函数
打开运行机器人工作流程的main函数。取代本土知识
对象调用使用代码生成创建的MEX函数。对于本例,使用简单的2-D路径跟踪示例。
打开带逆运动学的二维路径跟踪的例子。
openExample (“机器人/ TwoDInverseKinematicsExampleExample”)
修改示例代码以使用新的ikCodegen_mex
函数。下面的代码是示例的副本,只是对使用新的MEX函数进行了修改。定义机器人模型是在函数内部完成的,因此跳过构建机器人部分。
定义轨迹
T = (0:0.2:10)';%的时间Count = length(t);中心= [0.3 0.1 0];半径= 0.15;= t*(2*pi/t(end));点=中心+半径*[cos(theta) sin(theta) 0 (size(theta))];
运动学逆解
将配置方案预分配为矩阵,金宝搏官方网站qs
.指定末端执行器转换的权重和末端执行器名称。
Q0 = [0 0 0];Ndof =长度(q0);q = 0 (count, ndof);权重= [0,0,0,1,1,0];endEffector = '工具';
通过环点轨迹来跟踪圆。取代本土知识
对象调用ikCodegen_mex
函数。计算每个点的解,生成实现末端执行器位置的关节构型。存储配置以供以后使用。
qInitial = q0;%使用家庭配置作为初始猜测为I = 1:计数求解满足所期望的末端执行器的构型%的位置Point = points(i,:);qSol = ikCodegen_mex(endEffector,trvec2tform(point),weights,qInitial);存储配置q (i,:) = qSol;%从先前的溶液开始qInitial = qSol;结束
动画解决方案
现在所有的解都生成了。金宝搏官方网站动画结果。您必须重新创建机器人,因为它最初是在函数中定义的。遍历所有的解决方案。金宝搏官方网站
robot = rigidBodyTree('MaxNumBodies',15,'DataFormat','row');body1 = rigidBody('body1');界面。关节= rigidBodyJoint('jnt1','revolute');body2 = rigidBody('body2');jnt2 = rigidBodyJoint('jnt2','revolute');setFixedTransform(jnt2,trvec2tform([0.3 0 0]))Joint = jnt2;body3 = rigidBody('工具');jnt3 = rigidBodyJoint('jnt3','revolute');setFixedTransform(jnt3,trvec2tform([0.3 0 0]))Joint = 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
相关的话题
- 带逆运动学的二维路径跟踪
- 支持代码生成的函数金宝app
- 在命令行生成C代码(MATLAB编码器)
- 使用MATLAB Coder App生成C代码(MATLAB编码器)