主要内容

从机器人库中生成机器人逆运动学计算代码

这个例子展示了如何使用机器人库中的机器人执行代码生成来计算逆运动学(IK)。对于本例,您可以使用aninverseKinematics对象。rigidBodyTree机器人模型使用loadrobot解决机器人构型,以实现所需的末端执行器位置。

在二维平面上创建一个圆形轨迹,并将其作为生成的MEX逆运动学求解器的点。求解器计算实现该轨迹所需的关节位置。最后,对机器人进行动画化,以显示实现圆形轨迹的机器人配置。

写出求解运动学逆解的算法

创建一个函数,ikCodegen,为KINOVA®Gen3机器人模型运行逆运动学算法loadrobot

函数qConfig = ikCodegen(endEffectorName,tform,weights,initialGuess)% # codegen机器人=装载机器人(“kinovaGen3”“DataFormat”“行”);ik =逆运动学(“RigidBodyTree”,机器人);[qConfig,~] = ik(enffectorname,tform,weights,initialGuess);结束

该算法充当标准逆运动学调用的包装器。它接受标准输入,并返回一个机器人配置解决方案向量。因为您不能使用句柄对象作为代码生成支持的函数的输入或输出。金宝app在函数中加载机器人。保存ikCodegen函数在当前文件夹中。

在MATLAB中验证逆运动学算法

生成代码前在MATLAB中验证IK算法。

加载一个预定义的KINOVA®Gen3机器人模型为rigidBodyTree对象。设置数据格式为“行”

机器人=装载机器人(“kinovaGen3”“DataFormat”“行”);

展示机器人的细节。

showdetails(机器人)
-------------------- 机器人:(8个Body) Idx Body Name Joint Name Joint Type Parent Name(Idx) Children Name(s) ------------ ---------- ---------- ---------------- ---------------- 1 Shoulder_Link Actuator1转动base_link(0) HalfArm1_Link(2) 2 HalfArm1_Link Actuator2转动Shoulder_Link(1) HalfArm2_Link(3) 3 HalfArm2_Link Actuator3转动HalfArm1_Link(2) ForeArm_Link(4) 4 ForeArm_Link Actuator4转动HalfArm2_Link(3)腕1_link(5) 5腕1_link Actuator5转动ForeArm_Link(4)腕2_link(6) 6腕2_linkActuator6转动腕1_link (5) Bracelet_Link(7) 7 Bracelet_Link Actuator7转动腕2_link (6) EndEffector_Link(8) 8 EndEffector_Link Endeffector固定Bracelet_Link(7) --------------------

指定末端执行器名称、末端执行器变换的权值和初始关节位置。

endEffectorName =“EndEffector_Link”;权重= [0.25 0.25 0.25 1 1 1];initialGuess = [0 0 0 0 0 0 0 0];

为指定的末端执行器变换调用逆运动学求解函数。

targetPose = trvec2tform([0.35 -0.35 0]);qConfig = ikCodegen(endEffectorName,targetPose,weights,initialGuess)
qConfig =1×71.3085 2.2000 -1.3011 1.0072 -1.1144 2.0500 -3.2313

用计算出的机器人配置解决方案可视化机器人。

图;显示(机器人,qConfig);持有所有plotTransforms (tform2trvec (targetPose) tform2quat (targetPose),“FrameSize”, 0.5);

图中包含一个轴对象。axis对象包含29个patch、line类型的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

逆运动学算法生成代码

你可以使用codegen(MATLAB编码器)函数或MATLAB编码器(MATLAB编码器)应用程序生成代码。对于本例,通过调用生成一个MEX文件codegen在MATLAB命令行。属性为函数的每个输入指定样例输入参数arg游戏输入参数。

调用codegen函数,并在单元格数组中指定输入参数。此函数创建一个单独的ikCodegen_mex函数要使用。还可以使用options input参数生成C代码。这一步可能需要一些时间。

codegenikCodegenarg游戏{endEffectorName targetPose,重量,initialGuess}
代码生成成功。

使用生成的MEX函数验证结果

为指定的转换调用IK求解器的MEX版本。

targetPose = trvec2tform([0.35 -0.35 0]);qConfig = ikCodegen_mex(endEffectorName,targetPose,weights,initialGuess)
qConfig =1×71.3084 2.2000 -1.2999 1.0092 2.0277 -2.0500 -0.0872

使用IK求解器的MEX版本计算机器人配置,可视化机器人。

图;显示(机器人,qConfig);持有所有plotTransforms (tform2trvec (targetPose) tform2quat (targetPose),“FrameSize”, 0.5);

图中包含一个轴对象。axis对象包含29个patch、line类型的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

用MEX函数计算逆运动学

利用生成的MEX函数计算运动学逆解,实现轨迹。

定义轨迹

创造一个圆形的轨迹。

T = (0:0.2:10)';%的时间Count = length(t);中心= [0.3 0.3 0];半径= 0.15;= t*(2*pi/t(end));点=中心+半径*[cos(theta) sin(theta) 0 (size(theta))];

运动学逆解

预分配配置解决方案作为一个矩阵金宝搏官方网站qs.指定末端执行器转换的权重和末端执行器名称。

Q0 = [0 0 0 0 0 0 0];Ndof =长度(q0);q = 0 (count,ndof);权重= [0 0 0 1 1 1];endEffector =“EndEffector_Link”

通过环点轨迹来跟踪圆。使用ikCodegen_mex函数计算每个点的解,以生成实现末端执行器位置的关节配置。存储配置以供以后使用。

qInitial = q0;%使用家庭配置作为初始猜测I = 1:计数求解满足所需末端执行器的构型%的位置Point = points(i,:);qSol = ikCodegen_mex(endEffector,trvec2tform(point),weights,qInitial);存储配置q (i,:) = qSol;%从先前的溶液开始qInitial = qSol;结束

动画解决方案

一旦你生成了所有的解决方案,动画的结果。金宝搏官方网站您必须重新创建机器人,因为它最初是在函数中定义的。遍历所有的解决方案。金宝搏官方网站设置“FastUpdate”选项显示方法真正的得到一个平滑的动画。

机器人=装载机器人(“kinovaGen3”“DataFormat”“行”);显示第一个解和设置视图。图显示(机器人,qs (1:));查看(3)ax = gca;斧子。投影=“拼写”;持有情节(点(:1),点(:,2),“k”)轴([-0.1 0.7 -0.3 0.5])遍历解决方案金宝搏官方网站framesPerSecond = 15;r = rateControl(framesPerSecond);I = 1:count show(机器人,qs(I,:)),“PreservePlot”假的,“FastUpdate”,真正的);drawnow waitfor (r);结束

图中包含一个轴对象。axis对象包含26个patch、line类型的对象。